表示式求值(牛客)

2021-10-06 02:04:18 字數 1903 閱讀 9295

題目描述:

給定乙個字串描述的算術表示式,計算出結果值。

輸入字串長度不超過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...