藍橋杯 演算法訓練 表示式計算 (python實現)

2021-10-04 03:41:00 字數 3032 閱讀 1489

class

stack

(object):

# 初始化棧為空列表

def__init__

(self)

: self.items =

# 判斷棧是否為空,返回 true 或 false

defis_empty

(self)

:return self.items ==

# 壓棧,新增新元素進棧

defpush

(self,item)

:# 出棧,刪除棧頂元素,並返回

# 注:列表的pop()方法用於根據索引刪除並返回被刪除的元素,沒有傳入索引引數,預設刪除最後乙個元素

defpop

(self)

:return self.items.pop(

)# 返回棧頂元素

defpeek

(self)

:return self.items[

len(self.items)-1

]# 返回棧的大小

defsize

(self)

:return

len(self.items)

defcompare

(op1,op2)

:'''

比較兩個運算子的優先順序,乘除運算優先順序比加減高

op1優先順序比op2高返回true,否則返回false

'''return op1 in

["*"

,"/"

]and op2 in

["+"

,"-"

]# 中綴表示式轉化為字尾表示式

s =input()

stack_opt = stack(

)i =

0temp_expression =

''while i <

len(s)

:if s[i]

.isdigit():

start = i

while i +

1<

len(s)

and s[i +1]

.isdigit():

i +=

1 temp_expression += s[start:i+1]

+" "

elif stack_opt.size()==

0or stack_opt.peek()==

"(":

stack_opt.push(s[i]

)elif s[i]

=="("

or compare(s[i]

,stack_opt.peek())

: stack_opt.push(s[i]

)elif s[i]

==")"

:while stack_opt.peek()!=

"(":

temp_expression += stack_opt.pop()+

" " stack_opt.pop(

)# 左括號出棧

else

:while stack_opt.size()!=

0and

not compare(s[i]

,stack_opt.peek())

:if stack_opt.peek()==

"(":

break

temp_expression += stack_opt.pop()+

" " stack_opt.push(s[i]

) i +=

1while stack_opt.size():

temp_expression += stack_opt.pop()+

" "def

calculate

(num1,num2,operator)

:if operator ==

"+":

return

int(num1)

+int

(num2)

elif operator ==

"-":

return

int(num1)

-int

(num2)

elif operator ==

"*":

return

int(num1)

*int

(num2)

else

:return

int(num1)

/int

(num2)

defprocess

(data,operator)

: num2 = data.pop(

) num1 = data.pop(

) data.push(calculate(num1,num2,operator)

)nums = stack(

)j =

0while j <

len(temp_expression)

:if temp_expression[j]

.isdigit():

start = j

while j +

1<

len(temp_expression)

and temp_expression[j +1]

.isdigit():

j +=

1 nums.push(temp_expression[start:j+1]

)elif

not temp_expression[j]

.isspace():

process(nums,temp_expression[j]

) j +=

1print

(nums.pop(

))

評測結果:

來看詳細解說:python實現棧及棧在四則運算中的應用

藍橋杯 演算法訓練 表示式計算

之前在學習棧的時候老師講過這個問題 思路就是 1.將表示式 中綴式 轉化成字尾式 2.進行字尾式的計算。思路看起來很簡單,但是實際在敲 的時候還是要注意很多問題。下面分享一下個人做法,可以改進之處還希望大家可以指出來,共同進步!一 將中綴式轉化為字尾式 個人採用的是邊輸入邊進行處理 首先設定兩個棧,...

藍橋杯 演算法訓練 字首表示式

演算法訓練 字首表示式 時間限制 1.0s 記憶體限制 512.0mb 提交此題 問題描述 編寫乙個程式,以字串方式輸入乙個字首表示式,然後計算它的值。輸入格式為 運算子 物件1 物件2 其中,運算子為 加法 減法 乘法 或 除法 運算物件為不超過10的整數,它們之間用乙個空格隔開。要求 對於加 減...

藍橋杯 演算法訓練 表示式計算 棧的應用

輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入一行,包含乙個表示式。輸出這個表示式的值。1 2 3 4 5 4 表示式長度不超過100,表示式運算合法且運算過程都在int內進行。兩個棧,乙個存數字,乙個存運算子,掃瞄字串,當當前運算子優先順序小於棧頂運算子時,對上一次存...