表示式求值(棧的操作)

2021-07-29 05:02:38 字數 1633 閱讀 3196

問題描述

輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。

輸入格式

輸入一行,包含乙個表示式。

輸出格式

輸出這個表示式的值。

樣例輸入

1-2+3*(4-5)

樣例輸出

-4 資料規模和約定

表示式長度不超過100,表示式運算合法且運算過程都在int內進行。

解題思路:將中綴表示式轉化為字尾表示式

轉化方法見:

此題中分別使用符號棧和數值棧進行運算

源**:

#include

#include

#include

#include

#include

#include

using

namespace

std;

stack

str;

//符號棧

stack

num;

//數值棧

void sym(char ch)

//此函式用於將中綴表示式通過棧的操作轉化為字尾表示式,並在轉化的過程中同時進行字尾表示式的運算

else

else

if(str.top()=='-')

else

if(str.top()=='*')

else

if(str.top()=='/')

//將得到的結果壓入數值棧

str.pop();

//刪除符號棧棧頂元素

}if(ch==')')

//當前符號為)時,必將運算至(停止,所以無需將)壓入棧中,並且要將(刪除

else

//將運算子壓入符號棧中

}else

if(ch=='(')

//運算子為(時,直接壓入符號棧

else

if(ch=='*'||ch=='/')

else

str.pop(); //刪除棧頂元素

}str.push(ch);

//將當前運算子壓入符號棧中}}

}void sym2()

//此函式用於將所有運算子和數值壓入棧後,運算並未完成的情況下,完成字尾表示式的運算

else

if(str.top()=='-')

else

if(str.top()=='*')

else

if(str.top()=='/')

//將結果壓入數值棧中

str.pop();

//刪除符號棧棧頂元素

}}int main()

else

sym(ch[i]);

// number[k]='0';//將此前的結束符更改為非結束符字元,以便之後數值的轉化

k=0; }}

if('0'

<=ch[n-1]&&ch[n-1]<='9')

//中綴表示式結尾為數字時,由上面的迴圈可知,最後一位數值不會被壓入數值棧中

//將結尾數字壓入數值棧

sym2();//完成剩餘的運算

cout

0;}

表示式求值(棧)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 acm隊的mdd想做乙個計算器,但是,他要做的不僅僅是一計算乙個a b的計算器,他想實現隨便輸入乙個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。比如輸入 1 2 4 程式就輸出1.50 結果保留兩位小數 輸入...

棧 表示式求值

核心演算法思想 1.運用兩個棧,乙個存運算子,乙個存數值 2.以 做為標誌位,開頭或者結尾 3.檢查當前字元,若當前字元為數值,則加入數值棧,若為運算子,則檢驗當前運算子的優先順序,1 若當前運算子優先順序大於棧頂優先順序,則把該運算子壓入棧 2 若當前運算子優先順序等於棧頂優先順序 括號的情況 則...

棧 表示式求值

把運算的處理專門放在乙個函式裡,然後通過優先順序的判斷去呼叫函式,注意那個 還是放在else if裡面吧,不要和運算混在一起了 includeusing namespace std const int n 1e5 10 stacks1 stacks2 int flag 0 處理 四個 mapcmp ...