上網查了一下,採用字尾表示式
從中序表示式 轉換為 後序表示式
由於後續表示式更易計算機去解決,所以我們在運算算術表示式時要先轉換為後序的。方法如下
建立符號棧
順序掃瞄中序表示式
a) 是數字, 直接輸出
b) 是運算子
i : 「(」 直接入棧
ii : 「)」 將符號棧中的元素依次出棧並輸出, 直到 「(「, 「(「只出棧, 不輸出
iii: 其他符號, 將符號棧中的元素依次出棧並輸出, 直到 遇到比當前符號優先順序更低的符號或者」(「。 將當前符號入棧。
掃瞄完後, 將棧中剩餘符號依次輸出
例 : 3+(2-5)*6/3
遇到 3 是數字輸出
表示式 : 3
符號棧 :
遇到」+」 號 , 利用法則iii ,棧中沒有優先順序更低的符號, 直接入棧
表示式 : 3
符號棧 : +
遇到」(」 , 利用 法則i, 直接入棧
表示式 : 3
符號棧 : + (
遇到」2」 輸出
表示式 : 3 2
符號棧 : + (
遇到 「-」 , 利用法則iii , 遇到」(「, 沒有出棧符號, 直接入棧
表示式 : 3 2
符號棧 : + ( -
遇到」5」 輸出
表示式 : 3 2 5
符號棧 : + ( -
遇到」)」 利用法則ii , 將」-「號出棧輸出, 「(」 出棧
表示式 : 3 2 5 -
符號棧 : +
遇到」*」 利用法則ii , 「*」 比」+」的優先順序低, 所以遇到優先順序更低的符號, 不用出棧, 將」*」入棧
表示式 : 3 2 5 -
符號棧 : + *
遇到」6」 輸出
表示式 : 3 2 5 - 6
符號棧 : + *
遇到」/」 利用法則ii , 「/」 與」*」的優先相同, 就是說」*」不是優先順序更低的符號, 所以出棧輸出, 繼續 「+」比」/」的優先順序低, 不用出棧, 將」/」入棧
表示式 : 3 2 5 - 6 *
符號棧 : + /
遇到」3」 輸出
表示式 : 3 2 5 - 6 * 3
符號棧 : + /
掃瞄完成 將符號棧內的符號依次輸出
表示式 : 3 2 5 - 6 * 3 / +
直接過的**
# include
# include
#include
#include
#include
using
namespace
std;
stack
s_ch;//符號棧
stack
s_num; //數值棧
stack
s_temp;
int strtoint(string s)
string inttostr(int num)
int main()
}else
s_ch.pop();
}else
else
if ((s[i] == '+' || s[i] == '-') && (s_ch.top() == "("))
s_ch.push(s1);
if ((s[i] == '*' || s[i] == '/') && (s_ch.top() == "+" || s_ch.top() == "-" || s_ch.top() == "("))
s_ch.push(s1);
else
if ((s[i] == '*' || s[i] == '/') && (s_ch.top() == "*" || s_ch.top() == "/"))}}
}}while (!s_ch.empty())
while(!s_num.empty())
int flag = 0;
string s3;
while (!s_temp.empty())
else
s_temp.pop();
}if(flag)
cout
<< a;
else
cout
/cout << ' ' << f;
}
演算法訓練 表示式計算
演算法訓練 表示式計算 時間限制 1.0s 記憶體限制 256.0mb 問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4 資料規模和約定 表示式長度不超過10...
演算法訓練 表示式計算
題外話 自己孤陋寡聞,不知道c 有棧函式。無賴寫了兩個型別的棧函式,函式寫好了,可是對於表示式中的整數,一位還好處理,可是上了兩位的我就不知道該怎樣轉換成整型了忘了atoi函式,浪費了好多時間 自己太渣了 最後看了的部落格豁然開朗。只要熟悉棧,知道atoi函式,這題處理起來就沒什麼問題.題目 問題描...
演算法訓練 表示式計算
問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4 資料規模和約定 表示式長度不超過100,表示式運算合法且運算過程都在int內進行。問題分析 利用雙棧乙個儲存...