涓€銆侀棶棰樻弿杩?/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)锛屾爤瀛樺偍涓棿缁撴灉
杈撳叆: "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
if (prevOperator === '-') {
stack.push(-currentNum); // 鍑忔硶杞负鍔犺礋鏁?
} else if (prevOperator === '/') {
stack.push(Math.trunc(stack.pop()! / currentNum));
}
鍏€佸鏉傚害鍒嗘瀽
- 鏃堕棿澶嶆潅搴?/strong>锛歄(n)锛屽崟娆¢亶鍘?/li>
- 绌洪棿澶嶆潅搴?/strong>锛歄(n)锛屾爤瀛樺偍涓棿缁撴灉