- 轉化
中綴表達式直接求值實現並不現實,需要轉化成后綴表達式才能求值。
- 過程
- 開兩個棧,一個為符號棧,一個為數字棧,分別執行不同的分支操作。
*當遇到左括號時立刻將其壓人棧中,直到遇到右括號時將左右括號之間的符號和數字全部彈出運算。
*遇到一個數字時,將數字壓入數字棧中。
*遇到一個運算符時,將運算符與棧頂運算符比較,有下列四種情況:
- 如果當前運算符比棧頂運算符優先級要高,或者為左括號后的第一個運算符,則將其壓入棧中。
- 如果它比棧中元素優先級低或小,則彈出棧頂運算符並運算。
- 繼續比較,如果他比新的棧頂運算符優先級高,則回到第一步,否則重復2,3步。
- 如果掃描到了中綴表達式的末尾,則彈出所有運算符和相應位置的數字進行運算。
(如果碰到兩位數,用標記數組先記錄下來,再在計算中轉化)
3.代碼展示(code.Js)
1.兩步分別為操作棧和運算
#include<iostream> #include<stack> #include<cstring> #include<iomanip> using namespace std; char endnumber[100];//數字和字符棧 char number[100];//兩位數特殊下標 int z = 0;//下標 //a,b優先級比較 bool cmp(char a,char b) { if(a == '*'||a == '/') { if(b == '*'||b == '/') { return false; } else { return true; } } else { return false; } } //使用過渡棧存入后綴表達式 void get_stack(string s) { memset(number,1,sizeof(number)); stack<char>attitude; int l = s.length(); int i = 0; for(i = 0;i < l;i++) { char t = s[i]; if(t == '(') { attitude.push(t); } else if(t == ')') { char str1 = attitude.top(); while(str1 != '(') { endnumber[z++] = str1; attitude.pop(); str1 = attitude.top(); } attitude.pop(); } else if(t >= '0'&&t <= '9') { if(s[i+1] >= '0'&&s[i+1] <= '9') { number[z] = '0'; endnumber[z] = s[i]; z++; endnumber[z] = s[i+1]; z++; i++; } else { endnumber[z++] = s[i]; } } else { if(attitude.empty()) { attitude.push(t); } else { char str2 = attitude.top(); if(cmp(t,str2) || str2 == '(') { attitude.push(t); } else { while(!cmp(t,str2)&&str2 != '('&&!attitude.empty()) { attitude.pop(); endnumber[z++] = str2; if(!attitude.empty()) str2 = attitude.top(); } attitude.push(t); } } } } while(!attitude.empty()) { char str3 = attitude.top(); endnumber[z++] = str3; attitude.pop(); } // for(i = 0;i < z;i++) // cout<<endnumber[i]<<" "; } //從存儲中調出數字和字符進行計算,轉換成浮點數計算精確值 void get_calculate(string s) { int k = 1; stack<float>put_stack; if(number[0] == '0') { put_stack.push(((endnumber[0] - '0')*10+(endnumber[1]-'0'))*1.0); k++; } else put_stack.push(1.0*(endnumber[0] - '0')); for(int i = k;i < z;i++) { char t = endnumber[i]; if(t >= '0'&&t <= '9') { if(number[i] == '0') { put_stack.push(((endnumber[i] - '0')*10+(endnumber[i+1]-'0'))*1.0); i++; } else { put_stack.push((t - '0')*1.0); } } else { float x = put_stack.top(); put_stack.pop(); float y = put_stack.top(); put_stack.pop(); float tmp; if(t == '+') tmp = x+y; else if(t == '-') tmp = y-x; else if(t == '*') tmp = x*y; else tmp = y/x; put_stack.push(tmp); } } cout<<setiosflags(ios::fixed)<<setprecision(2)<<put_stack.top(); } int main() { string exp_middle;//中綴表達式 cin>>exp_middle; get_stack(exp_middle); get_calculate(exp_middle); return 0; }
