請寫一個整數計算器,支援加減乘三種運算和括號。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
- 三個數字的加減乘除模運算
- 超大整數的加減乘除計算方法
- FCC - 253 計算一個整數的階乘
- 如何用位運算實現整數的加減法
- LeetCode_0224. 基本計算器,帶括號和空格的加減法算式LeetCode
- Python有效括號字串判斷和深度計算Python字串
- 浮點數的加減乘除運算細節
- 【oracle】日期加減計算Oracle
- MongoDB 中的【加減乘除】運算MongoDB
- 位運算實現加減乘除
- 如何寫一個計算器?
- Python編寫一個簡單計算器Python
- NumPy 簡單算術:加減乘除及其他運算
- 一元稀疏多項式加減法計算器
- 從一個加減法運算程式碼理解特殊運算子的過載
- 大資料的運算加減乘除大資料
- timestamp型別的加減運算型別
- python如何計算數的階乘Python
- JavaScript浮點數加減乘除精確計算JavaScript
- 計算機組成原理浮點數加減計算機
- 33:計算分數加減表示式的值
- 運算整數C/C++位運算技巧C++
- java 日期加減天數、月數、年數的計算方式Java
- Verilog實現加減乘除運算
- Shell階段02 shell變數運算(整數運算/小數運算), shell變數案例變數
- 一種支援多種並行環境的柵格地理計算並行運算元並行
- N位二進位制數加減法運算圖靈機圖靈
- excel日期加減計算方法 excel計算日期時間差Excel
- 二進位制運算加減乘除+快速冪
- 四則運算計算器
- sympy —— Python 符號運算Python符號
- java大整數四則運算Java
- Python—三目運算Python
- Java中計算整數中唯一數字數量的3種方法Java
- mysql查詢中時間、日期加減計算MySql
- 高精度加減乘
- C語言程式設計-長整數加法運算C語言程式設計