/*stl 中棧的使用方法(stack)
基本操作:
#include stack s
s.push(x) 將x加入棧中,即入棧操作
s.pop() 出棧操作(刪除棧頂),只是出棧,沒有返回值
s.top() 返回第乙個元素(棧頂元素)
s.size() 返回棧中的元素個數
s.empty() 當棧為空時,返回 true
*//*將乙個普通的中序表示式轉換為逆波蘭表示式的一般演算法是:
首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1(含乙個結束符號),乙個作為輸入逆波蘭式的棧s2(空棧),
s1棧可先放入優先順序最低的運算子#,注意,中綴式應以此最低優先順序的運算子結束。
可指定其他字元,不一定非#不可。從中綴式的左端開始取字元,逐序進行如下步驟:
(1)若取出的字元是運算元,則分析出完整的運算數,該運算元直接送入s2棧
(2)若取出的字元是運算子,則將該運算子與s1棧棧頂元素比較,
如果該運算子優先順序大於s1棧棧頂運算子優先順序,則將該運算子進s1棧,
否則,將s1棧的棧頂運算子彈出,送入s2棧中,直至s1棧棧頂運算子低於(不包括等於)該運算子優先順序,
最後將該運算子送入s1棧。
(3)若取出的字元是「(」,則直接送入s1棧頂。
(4)若取出的字元是「)」,則將距離s1棧棧頂最近的「(」之間的運算子,逐個出棧,依次送入s2棧,此時拋棄「(」。
(5)重複上面的1~4步,直至處理完所有的輸入字元
(6)若取出的字元是「#」,則將s1棧內所有運算子(不包括「#」),逐個出棧,依次送入s2棧。
完成以上步驟,s2棧便為逆波蘭式輸出結果。不過s2應做一下逆序處理。便可以按照逆波蘭式的計算方法計算了!*/
/*計算方法:
新建乙個表示式, 如果當前字元為變數或者為數字,則壓棧,如果是運算子,
則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後,棧裡的就是結果。*/
/*我的演算法理解:
第一大步:把中綴表示式轉化為字尾表示式。
掃中綴式:
1.數字:直接取出進陣列ep
2.左括號:進棧op
3.右括號:從棧頂掃棧op,若不是左括號就出棧,加到陣列ep中,直到出現左括號,把左括號出棧
4.等號:將棧op中除'#'的元素全部輸出
5.運算子:比較棧頂與當前運算子優先順序,在棧頂優先順序高於當前運算子優先順序時,棧頂不斷出棧,
加到陣列ep中,否則,跳出迴圈,把當前運算子入棧。
第二大步:根據中綴表示式求值。
1.遇到數字:直接進棧num
2.遇到運算子:對棧頂的兩個元素進行出棧並運算,結果入棧num
3.遇到空格:自加,continue
4.遇到回車:直接跳出結束。
*///輸入要求:可以含有數字,小數點,運算子,以等號結束,最後加回車,不含有空格
#include #include #include #include #include #define n 1000
using namespace std;
stack op;//存字元的棧op
stack num;//儲存double資料的棧
int i,len,j;
char ch, str[n],ep[n];//str陣列儲存輸入的字串,ep陣列用於儲存字尾表示式
double calc(double a, char o, double b)//具體兩個元素的計算
}int pri(char ch)//根據符號返回優先順序
}void getnum()//把str中的數字串存到ep中
double getnum2()//把ep中的乙個數字以double型返回出來
void back()//op棧頂元素出棧,並進入ep中
void trans()//求字尾表示式
switch (str[i])
}}double cal()
if (ep[i] == '\n')//換行
if (ep[i] >= '0' && ep[i] <= '9')//數字
else//運算子
}}int main()
計算器 字尾表示式
不過目前這個功能太少,而且能算的十分有限,測試輸入為 4 4 5 3 測試輸出為 4 4 5 3 27 主要就是了解一下怎麼把中綴表示式轉化成字尾表示式,然後再利用字尾表示式求值,我後續會完善這個程式,做個真正意義上的計算器。o o 轉化步驟我搜尋了一下,大致如下 將中綴表示式轉換為等價的字尾表示式...
計算器(表示式計算 字尾表示式實現)逆波蘭表示式
問題描述 從標準輸入中讀入乙個整數算術運算表示式,如24 1 2 36 6 2 2 12 2 2 計算表示式結果,並輸出。要求 1 表示式運算子只有 表示式末尾的 字元表示表示式輸入結束,表示式中可能會出現空格 2 表示式中會出現圓括號,括號可能巢狀,不會出現錯誤的表示式 3 出現除號 時,以整數相...
字尾表示式做計算器程式
概念 字尾表示式是相較於中綴表示式而言的,像我們平時寫的2 3 4 5 6 7就是乙個中綴表示式,那麼如何將之變為字尾表示式呢?字尾表示式如何用來求解呢?先來第乙個問題 中綴 字尾 變為字尾表示式方法 規則 1.遇到運算元 直接新增到字尾表示式中 2.棧為空時,遇到運算子,直接入棧 3.遇到左括號 ...