題目鏈結
題目給出的是中綴表示式,中綴表示式是我們習慣上用的計算表示式,人腦計算方便快速,但是計算機不然,計算機計算波蘭和逆波蘭表示式都很方便,但對中綴表示式通常需要轉化成字首或字尾表示式才方便計算。
舉例:4 + 2 * 5 - 7 / 11
轉化成逆波蘭的形式是:4 2 5 * + 7 11 / -
對於人腦,轉化過程是對表示式按優先順序加括號,對每層括號將相應的操作符移到後面(移到後面是逆波蘭,移到前面是波蘭),最後一層一層去掉括號即得所求表示式((4+(25))-(7/11))–>((4+(25))(7/11))- -->((4(25) * )+(7/11))- -->((4(25)*)+)(7 11)/)- -->4 2 5 * + 7 11 / - (字首轉化同理,只不過操作符放在括號前面
對於計算機,實現中綴表示式的計算需要用兩個棧,乙個存運算元,乙個存操作符,遇到運算元壓棧,遇到操作符,如果此時運算元不夠2或者存操作符的棧是空的,那麼操作符壓棧,否則,判斷棧頂元素優先順序,因為±優先順序相同,可以合併判斷, / 和 * 的優先順序相同可以合併判斷,如果當前操作符為+或-那麼此時棧頂元素優先順序必然大於等於當前優先順序,因此丟擲存存數的棧的棧頂的2個元素對當前操作符棧的棧頂元素進行運算,並將計算結果壓入運算元棧,若當前操作符為 * 或 / 當棧頂元素操作符優先順序同當前操作符時丟擲兩個運算元進行運算然後將計算結果壓棧,否則,直接將操作符壓棧,這樣就能保證存操作符的棧中優先順序一直是從小到大,最後對操作符棧非空時繼續進行運算,當操作符用完時運算元棧必然只剩乙個元素,即計算結果,用上面的表示式4 + 2 * 5 - 7 / 11舉例(棧1存運算元,棧2存操作符)得如下演變過程:
棧1:4
棧2:+
棧1:4 2
棧2:+ *
棧1:4 2 5 -->4 10–>14
棧2:+ * --> + --> -
棧1:14 7
棧2:-
棧1:14 7 11
棧2:- /
棧1:14 7/11(結果是小數)
棧2:-
棧1:14-7/11–>小數,即計算結果
棧2:空
ac 31ms:
#include
#include
#include
#include
#include
using
namespace std;
double
calculate
(double a,
double b,
char ch)
return ans;
}int
main()
else
char ch=st2.
top(
);st2.
pop();
double b=st1.
top(
);st1.
pop();
double a=st1.
top(
);st1.
pop();
double ans=
calculate
(a,b,ch)
; st1.
push
(ans);}
}else
if(s[i]
=='*'
||s[i]
=='/'
)char ch=st2.
top(
);st2.
pop();
double b=st1.
top(
);st1.
pop();
double a=st1.
top(
);st1.
pop();
double ans=
calculate
(a,b,ch)
; st1.
push
(ans);}
}}}while
(!st2.
empty()
) cout
)
)<}return0;
}
hdu 1237 簡單計算器 棧
這個題目是大部分人都是用棧來寫的,本週訓練老師也講了兩次棧的原理。自己最近也看了資料結構中與棧有關的內容,還是比較深刻理解了沒有括號情況下表示式求解。include include include using namespace std char s 250 post 250 s是輸入的中綴表示式,...
hdu 1237 簡單計算器(棧)
hdu 1237 簡單計算器 棧 如果是 就把原數壓入棧 如果是 就把相反數壓入棧 如果是 就把當前數和棧頂數計算後壓入棧 如果是 就把當前數和棧頂數計算後壓入棧 注意該題是3 2而不是3 2,有空格 include include include include includeusing name...
hdu 1237 簡單計算器 棧
這個題目是大部分人都是用棧來寫的,本週訓練老師也講了兩次棧的原理。自己最近也看了資料結構中與棧有關的內容,還是比較深刻理解了沒有括號情況下表示式求解。include include include using namespace std char s 250 post 250 s是輸入的中綴表示式,...