解析
首先开一个整数的栈,一个运算符的栈(括号也包括)。
定义运算符的优先级:+ -
为 1 ,* /
为 2 。
定义一个函数void calc()
:取出数栈的两个顶部的数,一个运算符栈栈顶的运算符,进行运算,并将结果放入到数栈栈顶。
对读入的表达式以字符串来读取,从左到右扫描:
- 读到整数,则将数字储存到数栈中。
- 读到
(
,先储存到运算符栈中。 - 读到
)
,用calc()
一直进行运算,直到运算符栈的栈顶为(
,并将其弹出。 - 读到运算符,如果读入的运算符的优先级小于等于运算符栈栈顶的运算符,首先进行
calc()
运算,直到这个运算符的优先级大于栈顶的优先级(比如说读取进度为2 * 3 +
时,由于*
的优先级比+
高,要先将2 * 3
算出来),并将这个运算符压入栈顶。 - 读取结束后,继续用
calc()
进行运算,直到运算符栈空。 - 输出数栈的栈顶。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int num[N]; // 数组模拟栈
int a, b;
char op[N];
void calc(){
int y = num[a -- ];
int x = num[a -- ];
char ope = op[b -- ];
int res;
if (ope == '+') res = x + y;
else if (ope == '-') res = x - y;
else if (ope == '*') res = x * y;
else res = x / y;
num[ ++ a] = res;
}
int main(){
unordered_map<char, int> pr = {{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};
string str;
cin >> str;
for (int i = 0; str[i]; i ++ ){
char c = str[i];
if (c == '(') op[ ++ b] = c; // 读入`(`
else if (c == ')'){ // 读入`)`
while (op[b] ^ '(') calc();
b -- ;
}
else if (isdigit(c)){ // 读入数字
int j = i, res = 0;
while (str[j] and isdigit(str[j])) res = res * 10 + str[j ++ ] - '0';
num[ ++ a] = res;
i = j - 1;
}
else { // 读入运算符
while (b and pr[c] <= pr[op[b]]) calc();
op[ ++ b] = c;
}
}
while (b) calc(); // 读入结束,处理结果。
cout << num[a]; // 输出结果。
return 0;
}
老哥,map里还应该存个’(‘对应0,但是为啥你不存也可以过,我用c写的,不存就TLE了
map不存的话默认为0
噢原来如此,我c使用函数实现的,我说呢haha~~