以前写了一个中序表达式转后序表达式,今天发现有一部分是错的,现在进行更正:
而关于如何将中序表达式转为后序表达式。可以参考上面的做法,建立两个栈s1和s2,s1存储后序表达式的结果,s2存储运算符号。从左到右遍历,如果当前符号是数字则推入s1,如果当前符号是”(“推入s2,如果当前符号是”)”,将(之前的符号都弹出,推入s1;如果当前符号的优先级大于s2的顶部,则推入栈,否则一直弹出直到当前符号的优先级大于等于s2的顶部。最后把s2的所有符号都推入s1。
这里有一些错误,如果当前栈顶计算符号的优先级大于等于的当前计算符号,则弹出进行计算,直到栈为空或栈顶的计算符号小于当前计算符号上次没有注意这一点,所以有一点错误。现在进行更正。更正后的代码如下:
相关问题描述可以参见https://leetcode.com/problems/basic-calculator/#/description
不过这里我进行了改进可以计算加减乘除。
代码如下:
class Solution {
public:
//改进版可以计算加减乘除
bool compare(char op1, char op2) {
if (op1 == '*' || op1 == '/') {
if (op2 == '+' || op2 == '-') {
return 1;
}
else {
return 0;
}
}
else if (op1 == '+' || op1 == '-') {
if (op2 == '*' || op2 == '/') {
return -1;
}
else {
return 0;
}
}
return 0;
}
int calNumber(char op, int num1, int num2) {
if (op == '+') {
return (num1 + num2);
}
else if (op == '-') {
return (num1 - num2);
}
else if (op == '*') {
return (num1 * num2);
}
else if (op == '/') {
return (num1 / num2);
}
return -1;
}
int calculate(string s) {
if (s.size() == 0) {
return 0;
}
stack<int> num;
stack<char> op;
int i = 0;
while (i < s.size()) {
if (s[i] == ' ') {
i++;
continue;
}
if (s[i] == '(') {
op.push(s[i++]);
}
else if (s[i] == ')') {
while (op.top() != '(') {
int num2 = num.top();
num.pop();
int num1 = num.top();
num.pop();
num.push(calNumber(op.top(), num1, num2));
op.pop();
}
op.pop();
i++;
}
else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
while (!op.empty() && compare(op.top(), s[i] ) >= 0 && op.top() != '(') {
int num2 = num.top();
num.pop();
int num1 = num.top();
num.pop();
num.push(calNumber(op.top(), num1, num2));
op.pop();
}
op.push(s[i]);
i++;
}
else {
int n = 0;
while (i < s.size() && s[i] == ' ') {
i++;
}
while (i < s.size() && s[i] >= '0' && s[i] <= '9') {
n = n * 10 + (s[i++] - '0');
}
num.push(n);
}
}
while (!op.empty()) {
int num2 = num.top();
num.pop();
int num1 = num.top();
num.pop();
num.push(calNumber(op.top(), num1, num2));
op.pop();
}
return num.top();
}
};
有时候我问题没想清楚就写博客了,所以会有一些错误,如果大家发现了可以在评论里面告诉我,或者私信我。