中缀转后缀
前提:這里假設(shè)每個(gè)英語(yǔ)字母都表示一個(gè)數(shù),或者每一個(gè)數(shù)都是只有一個(gè)數(shù)字的。(要是可以自己再調(diào)整一下,就很容易改好了)
方法:
1. 如果是英語(yǔ)字母,或者是數(shù)字,就直接放到返回串里面
2. 如果是空格就直接跳過
3. 如果是右括號(hào)),就把棧中的字符都清出來,一直遇到一個(gè)左括號(hào)
4. 如果是左括號(hào),那就直接放到棧中(沒有人的優(yōu)先級(jí)比這個(gè)小了)
5. 剩下的就是運(yùn)算符。就一直清棧,一直到棧頂?shù)膬?yōu)先級(jí)比當(dāng)前字符要小
6. 最后的把棧中的字符全都清出來
簡(jiǎn)單證明:
第二條,有空格,直接跳過,沒有問題(為了提高容錯(cuò)性的)。
第一條,遇到了數(shù)字,或者是英語(yǔ)字母,就直接放到返回串中,這個(gè)也沒有問題,總要放數(shù)字嘛。
第三條,遇到了一右括號(hào),那么,很顯然,這一堆的運(yùn)算符,都是會(huì)被一個(gè)左括號(hào)和右括號(hào)給囊括的,所以,需要把還沒有被清走的表達(dá)式給清走
第四條,在描述的時(shí)候,已經(jīng)說了,左括號(hào)優(yōu)先級(jí)最小,自己先放就好了
第五條,關(guān)鍵的一條,如果前面的運(yùn)算級(jí)大于或者等于當(dāng)前運(yùn)算符的集合,那么說明前面的那些需要先算(唯一可能懷疑的就是那個(gè)相等的時(shí)候,這個(gè)其實(shí)是一個(gè)定義問題,也可以用不等于的,但是為了節(jié)省空間,就先把等于的情況給拿出來)
第六條,最后,如果前面的都沒有把操作符輸出的話,就清棧。這是顯然的,因?yàn)槟阒皇寝D(zhuǎn)換,并不會(huì)減少運(yùn)算符(把括號(hào)不算運(yùn)算符)。我們只需要證明,如果有棧到這個(gè)時(shí)候是非空的,就可以了。
a+b
上述例子就完成了說明。
代碼如下:歡迎批評(píng)指正,共同學(xué)習(xí)
#include<iostream> using namespace std; #include<stack> stack<string> oper; string mid2Post(string s){string ans;for (int i = 0; i < s.size(); ++i){if (s[i] >= '0' && s[i] <= '9' || s[i] >= 'a' && s[i] <= 'z' ||s[i] >= 'A' && s[i] <= 'Z'){ans += s.substr(i,1);ans += string(" ");} else if (s[i] == ' '){continue;} else if (s[i] == ')'){// this is a opernent ')'while (!oper.empty() && oper.top() != "(") {ans += oper.top();ans += string(" ");oper.pop();}if (!oper.empty())oper.pop();} else if (s[i] == '(') {oper.push(s.substr(i,1));} else { // 一直出棧,直到有比當(dāng)前要小的字符出現(xiàn) while (!oper.empty() &&( ( (oper.top() == "+" || oper.top() == "-" || oper.top() == "*" || oper.top() == "/")&& (s[i] == '+' || s[i] == '-') ) || ((s[i] == '*' || s[i] == '/') && (oper.top() == "*" ||oper.top() =="/"))) ) {ans += oper.top();ans += string(" ");oper.pop();} oper.push(s.substr(i,1));}}while (!oper.empty()){ans += oper.top();ans += string(" ");oper.pop();}return ans; }int main(){string s;cin >> s;cout << mid2Post(s)<< endl; }歡迎關(guān)注我用于做筆記的公眾號(hào):肥宅Sean筆記
總結(jié)
- 上一篇: 堆排序(C\C++)
- 下一篇: gcc: error: CreatePr