优先级比栈内的高,就放入;优先级比栈内的低,先把比自己低的弹出,再放入
代码借鉴自https://blog.csdn.net/weixin_44996854/article/details/102752227,感谢大佬的思路
#include <iostream> #include <stack> using namespace std; int lco(char c) { //放入栈之前 int num = -1; switch(c) { case '(': num = 6; break; case '*': case '/': num = 4; break; case '+': case '-': num = 2; break; case ')': num = 1; break; case '#': num = 0; break; default: num = -1; } return num; } int lso(char c) { //放入栈之后 int num = -1; switch(c) { case '(': num = 1; break; case '*': case '/': num = 5; break; case '+': case '-': num = 3; break; case ')': num = 6; break; case '#': num = 0; break; default: num = -1; } return num; } //优先级比栈内的高,就放入;优先级比栈内的低,先把比自己低的弹出,再放入 bool isNum(char c) { if (c >= '0' && c <= '9') return true; return false; } int main() { string s; getline(cin, s); s += '#'; stack<char> st; st.push('#'); string ts = ""; int i = 0; while (!st.empty()) { if (isNum(s[i]) || s[i] == '.') { if (isNum(s[i + 1]) || s[i + 1] == '.') { ts += s[i]; } else ts = ts + s[i] + ' '; i ++; } else if (((s[i] == '+' || s[i] == '-')) && (!isNum(s[i - 1]) && s[i - 1] != ')' || i == 0)) { //此时这个+/-是数字的正负号 if (s[i] == '-') { ts += s[i]; } i ++; } else if (lco(s[i]) > lso(st.top())) { st.push(s[i]); i ++; } else if (lco(s[i]) <= lso(st.top())) { if (st.top() != '(' && st.top() != '#') { ts = ts + st.top() + ' '; } else i ++; st.pop(); } } ts.erase(ts.end() - 1); cout << ts << endl; return 0; }太自大了,以为靠自学就可以学好,结果发现连中缀变后缀的方法都不知道。以后还是要好好听课。