前缀表达式(无括号)转成中缀表达式(有括号)思路及代码
生活随笔
收集整理的這篇文章主要介紹了
前缀表达式(无括号)转成中缀表达式(有括号)思路及代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
①思路:對前綴表達式進行從后往前的遍歷,利用一個棧來存放讀到的常量和變量。讀到運算符時,利用棧的特性(LIFO),先出棧的元素必然是運算符左邊的元素,后出棧的元素必然是運算符右邊的元素,然后在該表達式左右兩邊加上括號,再將得到的表達式存入棧中,遍歷完成之后棧頂元素即為所求的中綴表達式。
②模擬(手算):
③具體代碼:?
#include<string> #include<iostream> #include<ctype.h> //要用到isalpha()和isdigit()函數來識別字母與數字字符 #include<stack> using namespace std; void WritrExpr(string& E){stack<string> var_or_num; //用來存放常量(0-9)或變量(大小寫字母) int len = E.size();for(int i=len-1;i>=0;i--){ //由于是前綴表達式,故從后往前遍歷 if(isalpha(E[i])||isdigit(E[i])){ //讀到常量或變量則將其保存在棧中 string t(1,E[i]);var_or_num.push(t);}if(E[i]=='+'||E[i]=='-'||E[i]=='*'||E[i]=='/'||E[i]=='^'){ //讀到運算符則取出棧頂的兩個元素 string s="("; //左括號 s += var_or_num.top(); var_or_num.pop(); //第一個運算數,出棧 string t(1,E[i]);s += t; //將第一個運算數放到左括號后面 s += var_or_num.top(); var_or_num.pop(); //第二個運算數出棧 s +=")"; //補上右括號 var_or_num.push(s); //將結果放入棧中 }}cout<<var_or_num.top(); //輸出棧頂元素也即最終結果 } int main(){cout<<"輸入前綴表達式"<<endl;string E; getline(cin,E);WritrExpr(E);return 0; }總結
以上是生活随笔為你收集整理的前缀表达式(无括号)转成中缀表达式(有括号)思路及代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FHS三层目录结构
- 下一篇: flexnet服务器运行许可错误,使用试