中綴表示式值(資訊學奧賽一本通 T1358)

2021-10-19 07:02:13 字數 1984 閱讀 1668

題目描述

輸入乙個中綴表示式(由 0 ~ 9 組成的運算數、加減乘除四種運算子、左右小括號組成。

注意-也可作為負數的標誌,表示式以@作為結束符),判斷表示式是否合法,如果不合法,請輸出no

否則請把表示式轉換成字尾形式,再求出字尾表示式的值並輸出。

注意:必須用棧操作,不能直接輸出表示式的值。

輸入格式

一行為乙個以@結束的字串。

輸出格式

如果表示式不合法,請輸出no,要求大寫。

如果表示式合法,請輸出計算結果。

輸入樣例

1+2*8-9@

輸出樣例

8題解

stack:

不合法情況

多個運算子直接相鄰,例如1*2+-3

左右括號不匹配,例如1*)(2+3)-4

解題步驟

如果是數字:直接壓入數字棧中;

如果是(:直接壓入字元棧中;

如果是):就將括號內的表示式計算完;

如果是運算子:若當前運算子的優先順序 ≤ 前乙個運算子的優先順序,那麼就計算前面的,再將當前運算子加入字元棧中;

特殊情況

減號:如1 - 2 + 3,此時無需特殊處理;

負號:如-1 - 2 + 3(1 + 2) * (-3 + 4),此時應該把-1-3加入數字棧中;

#include

#include

#include

using

namespace std;

stack<

int> num;

stack<

char

> op;

map<

char

,int

> hash;

bool

is_op

(char c)

bool

check1

(string s)

bool

check2

(string s)

return stk.

empty()

;}void

cal(

)int

main()

hash[

'+']

= hash[

'-']=1

; hash[

'*']

= hash[

'/']=2

;for

(int i =

0; i < s.

size()

-1; i ++

)else

if(s[i]

=='('

)else

if(s[i]

==')'

)else

else op.

push

(s[i]);

}}while

(op.

size()

)cal()

; cout << num.

top(

)<< endl;

return0;

}

ps:其實測試資料裡並沒有負數的情況 ?

表示式括號匹配(資訊學奧賽一本通 T1353)

題目描述 假設乙個表示式有英文本母 小寫 運算子 和左右小 圓 括號構成,以 作為表示式的結束符。請編寫乙個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回yes 否則返回no。表示式長度小於 255,左圓括號少於 20 個。輸入格式 一行資料,即表示式。輸出格式 一行,即yes或no。輸入樣例...

計算(資訊學奧賽一本通 T1356)

題目描述 小明在你的幫助下,破密了ferrari設的密碼門,正要往前走,突然又出現了乙個密碼門,門上有乙個算式,其中只有 0 9,求出的值就是密碼。小明數學學得不好,還需你幫他的忙。用整數除法 輸入格式 共 1 行,為乙個算式。輸出格式 共 1 行,就是密碼。輸入樣例 1 3 2 7 2 69 2 ...

均值(資訊學奧賽一本通 T1060)

題目描述 給出一組樣本資料,包含n個浮點數,計算其均值,精確到小數點後4位。輸入 輸入有兩行,第一行包含乙個整數n n小於100 代表樣本容量 第二行包含n個絕對值不超過1000的浮點數,代表各個樣本資料。輸出 輸出一行,包含乙個浮點數,表示均值,精確到小數點後4位。輸入樣例 21.0 3.0 輸出...