优先级比栈内的高,就放入;优先级比栈内的低,先把比自己低的弹出,再放入
代码借鉴自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;
}
太自大了,以为靠自学就可以学好,结果发现连中缀变后缀的方法都不知道。以后还是要好好听课。