中綴表示式轉換成字尾表示式,自己寫的。
阿新 • • 發佈:2018-12-16
自己測試了幾個用例,都通過了。
語言是C++。
它用到的資料結構是:一個存放運算子的棧,名字是Sop,和一個存放字尾表示式的vector,名字是res。
它的規則是:
先設定好每個運算子的優先順序。
從左到右依次遍歷每一個字元。
1.遇到數字,直接放到push_back到vector裡面。
2.遇到 '(',直接壓到Sop的棧裡面。
3.遇到 ')',就把Sop的棧頂元素依次push_back到vector裡面,直到遇到 '(' ,但是注意,不要把左括號和右括號壓到棧裡。
4.遇到其他的運算子,
(1)如果Sop是空的,直接入棧。
(2)比較Sop的棧頂運算子和當前運算子的優先順序:
如果當前運算子str[i]的運算子 優先於 棧頂運算子Sop.top(),那麼str[i]入棧。 如果不是,就一直彈出棧頂的運算子到vector裡面,直到彈到棧空或者彈到左括號。
5.當for遍歷完所有的字元之後,Sop這個棧裡還有運算子,那麼依次彈出棧頂元素直到棧空。
這個小demo是運算元只能個位的運算元。
測試過的式子有:
1+2
(1+2)+3
1+2*3
(1+2)*3
後續再補充,暫時沒發現錯誤。
#include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <stack> #include <map> using namespace std; bool isNum(char a){ return (a<='9'&&a>='0'); } char* NifixToSuffix(char *str, vector<char> &res){ stack<char> Sop; int k=0; map<char,int> priority; priority['(']=priority[')']=1; priority['^']=2; priority['/']=priority['*']=priority['%']=3; priority['+']=priority['-']=4; for(int i=0;i<strlen(str);i++){ if(isNum(str[i])) res.push_back(str[i]); else if(str[i]=='(') Sop.push(str[i]); else if(str[i]==')') { while(Sop.top()!='('){ res.push_back(Sop.top()); Sop.pop(); } //remove '(' operator Sop.pop(); } else//是運算子 { if(Sop.empty()) Sop.push(str[i]); else if(priority[str[i]]<priority[Sop.top()]) Sop.push(str[i]); else{ while(priority[str[i]]>=priority[Sop.top()]) { if(Sop.top()=='(') break; res.push_back(Sop.top()); Sop.pop(); if(Sop.empty()) break; } Sop.push(str[i]); } } } while(!Sop.empty()){ res.push_back(Sop.top()); Sop.pop(); } for(int i=0;i<res.size();i++) cout<<res[i]; cout<<endl; cout<<endl; cout<<endl; } int main() { char c2[]={'(','1','+','2','+','9','*','9',')','*','3','/','3'}; vector<char> res ; res.clear(); NifixToSuffix(c2,res); }