time limit: 1 second
memory limit: 128 mb
從鍵盤讀入乙個字尾表示式(字串),只含有0~9組成的運算數及加減乘除四種運算子,每個運算數之間用乙個空格隔開,運算數個數不超過30個,不需要判斷給你的表示式是否合法,以@為結束標誌。(不排除@後面還有內容)
1行字元,每個數字後面用空格隔開,運算子不用空格。
一行,運算出來的結果,結果保留整數。
16 9 4 3 +*-@
-47【題解】
這題的難度在於字串的處理上。
我們讀入了乙個字串。但是我們不知道其是數字還是負號。所以要進行判斷。
如果s[0]∈[+ * /]則是符號。
但是如果s[0] == '-',則需要後續判斷因為這可能是乙個負數。
然後如果這個s的長度為1,則是符號。
如果長度不為1,則看一下s[1]是否為數字,如果為數字,則我們讀入的是乙個數字。否則我們讀入的是一
系列的符號。
讀到符號就把棧頂的兩個元素做相應的運算。下面那個 操作符 上面那個。
然後top--;stack[top] = 運算結果。
//而字首表示式則是 上面那個 操作符 下面那個。
會出現/*5這樣的情況。即符號和數字連在了一起。要注意處理。
【**】
#include #include #include #include using namespace std;
int top = 0;
double stack[255];
int main()
else
if (ss[0] == '*' || ss[0] == '/' || ss[0] == '+') //如果是其他負號 則一定是符號
issymbol = true;
else
isnumber = true;//否則就是數字
if (isnumber) //如果是數字,則入棧
else
double x; //因為涉及到除法運算 所以用實型
if (ss[j] == '*') //根據字元 做相應的運算即可。
if (ss[j] == '-')
if (ss[j] == '+')
if (ss[j] == '/')
j++;}}
s = s.erase(0,p+1);//連同空格一起刪掉。
p = s.find(' ',0);//然後繼續找那個空格的位置
} printf("%.0lf",stack[top]);//要保留整數輸出。
return 0;
}
中綴表示式轉字尾表示式 求字尾表示式值
中綴表示式轉字尾表示式 佇列q和棧s q存放字尾表示式結果 s存放操作符 設棧頂元素top 當前讀取元素a 演算法如果s是空棧 a入棧非空棧 a不是操作符,a插入佇列q 如果a為 a入棧 否則,如果a為 把棧內操作符出棧依次插入佇列q,直至遇到得 元素出棧為止 否則,如果a優先順序大於top,a入棧...
求字尾表示式的值
上篇文章介紹了 中綴表示式 轉 字尾表示式 這篇文章接著分享 計算字尾表示式的值 需求 求字尾表示式的值 輸入 字尾表示式 輸出 運算結果 from test05 stack.stack import stack import re defafter opt ret expr 運算元範圍 expr ...
中綴表示式轉字尾表示式 求表示式的值
中綴轉字尾需要遵守以下規則 1 運算元 直接輸出 2 直接入棧 3 將 以前的直接輸出,並將 出棧 不輸出 4 運算子 將優先順序不小於該運算子的操作符出棧,最後將該運算子入棧 5 最後將棧中的元素依次彈出 6 優先順序 大於 大於 class intosuf if op i equals if o...