請寫一個整數計算器,支援加減乘三種運算和括號。Python版本
面試之手撕程式碼-請寫一個整數計算器,支援加減乘三種運算和括號。Python
思路
首先建立兩個棧,一個用來存放數字,一個用來存放符號
之後遍歷使用者輸入的表示式,對數字壓入數字棧,對於符號壓入符號棧,不過壓入符號棧時候有如下規則:
(1) 如果符號為"(",直接壓入符號棧,如果為")",不壓符號棧,而要進行出棧,直到遇到"("停止;在這過程中對數字棧出棧兩次,與符合棧出棧的符號(除"(")做運算,結果壓入數字棧;
(2).如果符為"*","/",如果符號棧為空,直接壓棧;否則執行如下:
如果當前棧頂元素為"/"或"*",出棧,直到非二者,並且,將出棧符號和數字棧中取出兩個數運算,結果壓入數字棧;如果為別的元素,則直接壓入符號棧 。
(3).如果符為"-","+",如果符號棧為空,直接壓棧;否則執行如下:
如果當前棧頂元素為"/"或"*","-"或"+",出棧,直到非它們中任何一個,並且,將出棧符號和數字棧中取出兩個數運算,結果壓入數字棧;如果當前棧頂元素為別的元素,則直接壓入符號棧 。
示例1
輸入"1+2"
結果為:3
示例2
輸入"(2*(3-4))*5"
結果為:-10
示例3
輸入"3+2*3*4-1"
結果為:26
具體程式碼:
class Solution:
def solve(self , s ):
# write code here
def computer(first,last,sign):
if sign == "+":
return first + last
if sign == "/":
return first / last
if sign == "*":
return first * last
if sign == "-":
return first - last
sign_stack = []
number_stack = []
number = 0
for i in range(len(s)):
if s[i] >= '0' and s[i] <='9':
number = number * 10 + int(s[i])
if i + 1 < len(s) and s[i+1]>='0' and s[i+1] <='9':
continue
else:
number_stack.append(number)
number = 0
elif s[i] == "(":
sign_stack.append(s[i])
elif s[i] == ")":
while sign_stack[-1] != "(":
last = number_stack.pop()
first = number_stack.pop()
sign = sign_stack.pop()
res = computer(first,last,sign)
number_stack.append(res)
sign_stack.pop()
elif s[i] in ["*","/"]:
if len(sign_stack) == 0:
sign_stack.append(s[i])
elif sign_stack[-1] in ["*","/"]:
while len(sign_stack) != 0 and sign_stack[-1] in ["*","/"]:
last = number_stack.pop()
first = number_stack.pop()
sign = sign_stack.pop()
res = computer(first,last,sign)
number_stack.append(res)
sign_stack.append(s[i])
else:
sign_stack.append(s[i])
elif s[i] in ["+","-"]:
if len(sign_stack) == 0:
sign_stack.append(s[i])
elif sign_stack[-1] in ["+","-","*","/"]:
while len(sign_stack) != 0 and sign_stack[-1] in ["+","-","*","/"]:
last = number_stack.pop()
first = number_stack.pop()
sign = sign_stack.pop()
res = computer(first,last,sign)
number_stack.append(res)
sign_stack.append(s[i])
else:
sign_stack.append(s[i])
while sign_stack:
last = number_stack.pop()
first = number_stack.pop()
sign = sign_stack.pop()
res = computer(first,last,sign)
number_stack.append(res)
return number_stack[-1]
相關文章
- JavaScript加減乘數運算JavaScript
- LeetCode_0224. 基本計算器,帶括號和空格的加減法算式LeetCode
- 三個數字的加減乘除模運算
- 超大整數的加減乘除計算方法
- Python有效括號字串判斷和深度計算Python字串
- shell加減乘除運算
- Python編寫一個簡單計算器Python
- 浮點數的加減乘除運算細節
- 【oracle】日期加減計算Oracle
- Verilog實現加減乘除運算
- MongoDB 中的【加減乘除】運算MongoDB
- 位運算實現加減乘除
- python如何計算數的階乘Python
- NumPy 簡單算術:加減乘除及其他運算
- JavaScript浮點數加減乘除精確計算JavaScript
- 計算機組成原理浮點數加減計算機
- 或與運算和安全整數(數的影子)
- Shell階段02 shell變數運算(整數運算/小數運算), shell變數案例變數
- 位運算-判斷一個數是否為2的整數次方
- Python—三目運算Python
- excel日期加減計算方法 excel計算日期時間差Excel
- latex 中乘號、恆等號、花括號的寫法
- 二進位制運算加減乘除+快速冪
- python中字串基本操作以及三種位運算Python字串
- Python數學運算Python
- 四則運算計算器
- Java中計算整數中唯一數字數量的3種方法Java
- java大整數四則運算Java
- Flutter最佳入門方式——寫一個計算器Flutter
- C語言程式設計-長整數加法運算C語言程式設計
- latex 中乘號、恆等好、花括號的寫法
- 實時計算小括
- mysql查詢中時間、日期加減計算MySql
- 矩陣類及其常規運算(加、減、乘、轉置、求逆、行列式、代數餘子式、伴隨矩陣)矩陣
- 計算階乘
- 簡單混合運算的計算器
- 一個不讓用加號的需求而引發的Java位運算詳解Java
- 9.3.2另一種計算機器2計算機