琛ㄨ揪寮忔眰鍊煎櫒瀹炵幇锛氳繍绠楃浼樺厛绾у鐞嗘妧宸?/h1>

涓€銆侀棶棰樻弿杩?/h2>

瀹炵幇涓€涓畝鍖栫増鏁板琛ㄨ揪寮忔眰鍊煎櫒锛屾敮鎸佸姞娉?+)鍜屼箻娉?*)杩愮畻锛屾纭鐞嗚繍绠楃浼樺厛绾с€?/p>

// 绀轰緥
evaluate("2+3*4")    // 杩斿洖 14 (鍏堢畻3*4=12锛屽啀绠?+12)
evaluate("2*3+4*5")  // 杩斿洖 26 (6+20)
evaluate("10+2*3+5") // 杩斿洖 21

浜屻€佹牳蹇冮毦鐐癸細杩愮畻绗︿紭鍏堢骇

涔樻硶浼樺厛浜庡姞娉曪紝涓嶈兘绠€鍗曚粠宸﹀埌鍙宠绠椼€傞渶瑕佸厛澶勭悊鎵€鏈変箻娉曪紝鍐嶅鐞嗗姞娉曘€?/p>

涓夈€佽В娉曪細鏍堢疮绉硶

浣跨敤鏍堝瓨鍌ㄥ緟鍔犵殑鏁板€硷紝閬囧埌涔樻硶鏃剁珛鍗宠绠楀苟鏇存柊鏍堥《锛?/p>

function evaluateExpression(expr: string): number {
    const stack: number[] = [];
    let currentNum = 0;
    let prevOperator = '+';
    
    for (let i = 0; i <= expr.length; i++) {
        const char = expr[i];
        
        // 绱Н鏁板瓧
        if (char >= '0' && char <= '9') {
            currentNum = currentNum * 10 + parseInt(char);
            continue;
        }
        
        // 閬囧埌杩愮畻绗︽垨缁撴潫锛屽鐞嗕箣鍓嶇疮绉殑鏁板瓧
        if (char === '+' || char === '*' || i === expr.length) {
            if (prevOperator === '+') {
                // 鍔犳硶锛氭暟瀛楀叆鏍堢瓑寰呮渶鍚庢眰鍜?
                stack.push(currentNum);
            } else if (prevOperator === '*') {
                // 涔樻硶锛氱珛鍗充笌鏍堥《璁$畻
                stack.push(stack.pop()! * currentNum);
            }
            
            prevOperator = char;
            currentNum = 0;
        }
    }
    
    // 鏍堜腑鎵€鏈夋暟姹傚拰
    return stack.reduce((sum, n) => sum + n, 0);
}
馃挕 鍏抽敭鎬濊矾锛?/strong>閬囧埌 + 鏃舵暟瀛楀叆鏍堟殏瀛橈紝閬囧埌 * 鏃剁珛鍗宠绠椼€傛渶鍚庢爤涓彧鍓╁緟鍔犵殑鏁帮紝姹傚拰鍗冲彲銆?

鍥涖€佹墽琛岃繃绋嬫紨绀?/h2>
杈撳叆: "2+3*4+5"

姝ラ1: 璇诲彇'2', prevOp='+' 鈫?鏍?[2]
姝ラ2: 璇诲彇'3', prevOp='+' 鈫?鏍?[2,3]  
姝ラ3: 璇诲彇'4', prevOp='*' 鈫?3*4=12 鈫?鏍?[2,12]
姝ラ4: 璇诲彇'5', prevOp='+' 鈫?鏍?[2,12,5]
姝ラ5: 缁撴潫锛屾眰鍜?2+12+5=19

浜斻€佹墿灞曪細鏀寔鍑忔硶鍜岄櫎娉?/h2>
if (prevOperator === '-') {
    stack.push(-currentNum);  // 鍑忔硶杞负鍔犺礋鏁?
} else if (prevOperator === '/') {
    stack.push(Math.trunc(stack.pop()! / currentNum));
}

鍏€佸鏉傚害鍒嗘瀽

  • 鏃堕棿澶嶆潅搴?/strong>锛歄(n)锛屽崟娆¢亶鍘?/li>
  • 绌洪棿澶嶆潅搴?/strong>锛歄(n)锛屾爤瀛樺偍涓棿缁撴灉
鏍堝簲鐢?/span> 琛ㄨ揪寮忔眰鍊?/span> 瀛楃涓茶В鏋?/span> 杩愮畻绗︿紭鍏堢骇