題目描述
輸入乙個中綴表示式(由 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 輸出...