題目描述:給定乙個字串描述的算術表示式,計算出結果值。
輸入字串長度不超過100,合法的字元包括」+, -, *, /, (, )」,」0-9」,字串內容的合法性及表示式語法的合法性由做題者檢查。本題目只涉及整型計算。
輸入描述:輸入算術表示式(中綴表示式)400+5
輸出描述:計算出結果值405
做題思路:將輸入的中綴表示式,轉換為對應的字尾表示式進行計算
中綴表示式:5+4*6/2+3+(4*5)/5
對應的字尾表示式:5 4 6 * 2 / 3 + 4 5 * 5 / +
中綴表示式轉為字尾表示式:
設定乙個空棧s1
1.遇到運算元直接輸出(輸出的含義是指追加到當前字尾表示式後面)
2.棧為空時,遇到運算子,直接入棧
3.遇到左括號時,直接入棧
4.遇到右括號時,如果棧頂的操作符不為左括號,一直出棧,並將出棧的操作符輸出。當棧頂的操作符是左括號時,將左括號出棧, 停止本步驟。
5.遇到+-*/運算子op時,如果(棧非空 並且 棧頂操作符的優先順序大於等於op時)一直將出棧,並將出棧的操作符輸出。當(不滿足棧非空 並且 棧頂操作符的優先順序大於等於op)時,將op入棧
(棧非空 並且 棧頂操作符的優先順序大於等於op時 指的是 滿足加減優先順序大於等於加減,乘除優先順序大於等於加減乘除的情況,其他情況均視為不滿足)
6.將棧中所有元素以此出棧輸出
利用字尾表示式計算結果:
設定乙個空棧s2
順序掃瞄字尾表示式s1的每一項,然後根據當前項的型別做出相應的操作
1.如果當前項是運算元:將其壓入棧s2中
2.如果當前項是操作符op:從s2彈出棧頂y,在彈出棧頂x,計算 xy 並將結果壓入棧 s2
當s1掃瞄結束,s2的棧頂元素值即為表示式的結果
注意事項:#includestring s;
int num = atoi(s.c_str());
#inclduestacks;
char c = s.top();
s.push('a');
s.pop(); //返回值是void
#includechar c;
isdigit(c);
isalpha(c);
ac**:#include#include#include#include#include#includeusing namespace std;
bool cmppriority(char s,char c); //比較操作符的優先順序
vectorstrans(string &str);//將中綴表示式轉換為字尾表示式
int calculate(vectorres);//根據字尾表示式計算結果
int main()
else
if( res[i]=="-" )
if( res[i]=="*" )
if( res[i]=="/" )
} }return result.top();
}
牛客網 程式設計題 表示式求值
給出乙個布林表示式的字串,比如 true or false and false,表示式只包含true,false,and和or,現在要對這個表示式進行布林求值,計算結果為真時輸出true 為假時輸出false,不合法的表達時輸出error 比如 true true 表示式求值是注意and 的優先順序...
牛客 最小表示式
題目連線 題解 比賽的時候把題看錯了,以為只改變 的位置,補題時候,參考 發現數字的順序也可以改變,有點難受,如果是這樣的話,那其實挺好想的,按加號分一下塊,把數字排乙個序,從小到大一遍一遍的往塊裡加,直到加完,然後用大數加法,把他們相加就好了 不知道為甚一直發生段錯誤的 include h usi...
表示式求值
程式的說明見清華大學出版社 資料結構 c語言版 include include define stack init size 40 define stackincrement 20 define ok 1 define false 0 typedef structs stack typedef st...