表达式匹配的问题,可以利用栈来解决。这里利用两个栈,数字栈和符号栈,实现表达式的匹配。这里需要特别注意的几个点:1. 注意符号优先级情况下的处理问题,在操作符入栈的时候,要进行符号优先级的比较,如果入栈符号的优先级小于或者等于栈顶符号,则先对优先级更高的栈顶符号进行运算; 2. 注意处理负数的问题,如果碰到负数,则可以将0加入数字栈中。
#include <iostream>
#include <string>
#include <stack>
#include <vector>
#include <unordered_map>
using namespace std;

void cal(stack<int> &nums, stack<char> &symbols) {
    int num1 = nums.top();
    nums.pop();
    int num2 = nums.top();
    nums.pop();
    char ch = symbols.top();
    symbols.pop();
    int ans = 0;
    switch (ch) {
        case '+': { ans = num2 + num1; break; }
        case '-': { ans = num2 - num1; break; }
        case '*': { ans = num2 * num1; break; }
        case '/': { ans = num2 / num1; break; }
    }
    nums.push(ans);
}

int main() {
    string s;
    getline(cin, s, '\n');
    stack<int> nums;
    stack<char> symbols;
    unordered_map<char,int> priority;
    priority['('] = 0; priority[')'] = 0; priority['+'] = 1; priority['-'] = 1; priority['*'] = 2; priority['/'] = 2;
    if (s[0] == '-') nums.push(0);    // 不要忘记考虑第一个数字为负数的情况
    for (int i = 0; i < s.size(); i++) {
        if (s[i] >= '0' && s[i] <= '9') {
            int left = i;
            int right = i;
            while (s[right + 1] >= '0' && s[right + 1] <= '9') {
                right++;
            }
            nums.push(stoi(s.substr(left, right - left + 1)));
            i = right;
        } else if (s[i] == '(') {
            if (i != s.size() - 1) if (s[i + 1] == '-') nums.push(0);   // 不要忘记负数的情况
            symbols.push(s[i]);
        } else if (s[i] == ')') {
            while (symbols.top() != '(') {
                cal(nums, symbols);
            }
            symbols.pop();   // 弹出左括号
        } else {
            while (!symbols.empty() && (priority[s[i]] <= priority[symbols.top()])) {
                cal(nums, symbols);
            }
            symbols.push(s[i]);
        }
    }
    while (!symbols.empty()) {
        cal(nums, symbols);
    }
    cout << nums.top() << endl;
}