演算法訓練 表示式計算(棧)

2021-08-09 13:34:38 字數 1245 閱讀 5984

演算法訓練 表示式計算  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

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

輸入格式

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

輸出格式

輸出這個表示式的值。

樣例輸入

1-2+3*(4-5)

樣例輸出

-4資料規模和約定

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

解題思路:首先,題目所給的是中綴表示式,那麼就要將中綴表示式變成字尾表示式;

步驟如下:

最後得到的字尾表示式就是:1 2 - 3 4 5 - * +;

然後按照符號開始就算: (1) -1 3 4 5 - * +

(2)-1 3 -1 * +

(3)-1 -3 +

(4)-4

如果掃瞄到的是數字,那麼直接入數值棧;

如果是符號:

1):如果是『(』,直接入符號棧

2):如果是『)』,則把符號棧裡的符號一次放入到數值棧,知道出現『(』,然後將『(』去掉

3):其它符號,如果前乙個優先順序比它低,則直接入符號棧,否則,將前乙個符號入數值棧,並且在符號棧中移除,再將其入棧;

**如下:

#include #include #include #include #include #include #include using namespace std;

stacks1,s2;

stackq;

string s;

int f(string a)

} else

s1.pop();///去掉『('

}else if( (s[i]=='+' || s[i]=='-') && (s1.top()!="("))else if( (s[i]=='*' || s[i]=='/') && (s1.top()=="*" || s1.top()=="/"))else s1.push(t1);}}

while(!s1.empty())

s2.pop();

while(!s2.empty()){///將棧中所有元素倒置

s1.push(s2.top());

///cout<

演算法訓練 表示式計算

上網查了一下,採用字尾表示式 從中序表示式 轉換為 後序表示式 由於後續表示式更易計算機去解決,所以我們在運算算術表示式時要先轉換為後序的。方法如下 建立符號棧 順序掃瞄中序表示式 a 是數字,直接輸出 b 是運算子 i 直接入棧 ii 將符號棧中的元素依次出棧並輸出,直到 只出棧,不輸出 iii ...

演算法訓練 表示式計算

演算法訓練 表示式計算 時間限制 1.0s 記憶體限制 256.0mb 問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4 資料規模和約定 表示式長度不超過10...

演算法訓練 表示式計算

題外話 自己孤陋寡聞,不知道c 有棧函式。無賴寫了兩個型別的棧函式,函式寫好了,可是對於表示式中的整數,一位還好處理,可是上了兩位的我就不知道該怎樣轉換成整型了忘了atoi函式,浪費了好多時間 自己太渣了 最後看了的部落格豁然開朗。只要熟悉棧,知道atoi函式,這題處理起來就沒什麼問題.題目 問題描...