遗留问题❗️ 哈希表的初始化
计算四则表达式
大意
输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法
样例
输入:
3+2*{1+2*[-4/(8-6)+7]}
输出:25
思路
-
1⃣️预处理
- 把其他括号类型都统一为
圆括号
😄 - 如果第一个数字是负数,为了方便处理前面添一个0
- 把其他括号类型都统一为
-
2⃣️枚举每个字符
- 数字入栈
-
(
括号入展 -
)
把配对的那一段计算出来 - 运算符,如果
当前
的运算符优先级不大于
栈顶运算符 先计算出来
-
3⃣️用哈希表来存运算符的优先级
-
unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};
通过✅ -
unordered_map<char, int> pr{{'+', 0}, {'-', 0}, {'*', 1}, {'/', 1}};
报错❓ 段错误
-
代码
#include <iostream>
#include <algorithm>
#include <stack>
#include <unordered_map>
using namespace std;
stack<int> nums;
stack<char> ops;
unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};
string transfer(string &s)
{
if(s[0] == '-') s = '0' + s;
for(int i = 0; i < s.size(); i++)
{
if(s[i] == '{' || s[i] == '[') s[i] = '(';
if(s[i] == '}' || s[i] == ']') s[i] = ')';
}
return s;
}
void eval()
{
int b = nums.top(); nums.pop();
int a = nums.top(); nums.pop();
char op = ops.top(); ops.pop();
int c;
if(op == '+' ) c = a + b;
else if (op == '-' ) c = a - b;
else if (op == '*' ) c = a * b;
else c = a / b;
nums.push(c);
}
int calc(string s) {
int n = s.size();
//pr['+'] = pr['-'] = 1;
//pr['*'] = pr['/'] = 2;
for(int i = 0; i < n; i ++){
char c = s[i];
if(isdigit(c)){
int sum = 0, j = i;
while(j < n && isdigit(s[j])) sum = sum * 10 +(s[j ++] - '0');
nums.push(sum);
i = j - 1;
}
else if(c == '(') ops.push(c);
else if(c == ')'){
while(ops.size() && ops.top()!= '(') eval();
ops.pop();
}
else{
while(ops.size() && pr[ops.top()] >= pr[c]) eval();
ops.push(c);
}
}
while(ops.size()) eval();
return nums.top();
}
int main()
{
string s;
cin >> s;
s = transfer(s);
int res = calc(s);
cout << res << endl;
return 0;
}