计算四则表达式 利用2个栈

遗留问题❗️ 哈希表的初始化

计算四则表达式

大意

输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法

样例

输入: 3+2*{1+2*[-4/(8-6)+7]}
输出: 25

思路

  • 1⃣️预处理

    • 把其他括号类型都统一为圆括号
    • 如果第一个数字是负数,为了方便处理前面添一个0
  • 2⃣️枚举每个字符

    • 数字入栈
    • (括号入展
    • ) 把配对的那一段计算出来
    • 运算符,如果当前的运算符优先级不大于栈顶运算符 先计算出来
  • 3⃣️用哈希表来存运算符的优先级

    • unordered_map pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}}; 通过✅
    • unordered_map pr{{'+', 0}, {'-', 0}, {'*', 1}, {'/', 1}}; 报错❓ 段错误

代码

#include 
#include 
#include 
#include 

using namespace std;

stack nums;
stack ops;
unordered_map 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;
}

你可能感兴趣的:(计算四则表达式 利用2个栈)