C++ 实现计算器(使用两个栈实现一个加减乘除计算器)

代码

#include <cstdio>
#include <cctype>
#include <cstring>
#include <iostream>
#include <stack>
using namespace std;

typedef long long LL;
const int SIZE = 1010;
char str[SIZE];
stack<char> OPERATOR;  // 操作符
stack<LL> OPERAND;     // 操作数

inline int get_priority(char ch) {
    switch (ch) {
    case '(':
        return 0;
    case '+':
    case '-':
        return 1;
    case '*':
    case '/':
        return 2;
    case ')':
        return 3;
    }
}

inline LL calc() {
    LL b = OPERAND.top(); OPERAND.pop();
    LL a = OPERAND.top(); OPERAND.pop();
    char ch = OPERATOR.top(); OPERATOR.pop();

    switch (ch) {
    case '+':
        return a+b;
    case '-':
        return a-b;
    case '*':
        return a*b;
    case '/':
        return a/b;
    }
}

int main() {
    cin >> str;
    int priority_top, priority_cur;
    LL number;
    int i = 0, len = strlen(str)-1;
    while (i < len) {
        if (isdigit(str[i])) {
        	// 如果是数字
            number = 0;
            while (i < len && isdigit(str[i])) {
            	// 读全数字
                number = number * 10 + (str[i] - '0');
                i++;
            }
            OPERAND.push(number);
        } else {
            if (OPERATOR.empty()) {
                OPERATOR.push(str[i]);
                i++;
                continue;
            }
            priority_top = get_priority(OPERATOR.top());
            priority_cur = get_priority(str[i]);
            if (priority_cur == 0) {
            	// 如果是左括号 (
                OPERATOR.push(str[i]);
                i++;
            } else if (priority_cur == 3) {
            	// 如果是右括号 ),计算到第一个左括号 ( 内的表达式的值
                while (OPERATOR.top() != '(') {
                    number=calc();
                    OPERAND.push(number);
                }
                // 弹出右括号 )
                OPERATOR.pop();
                i++;
            } else {
                while (!OPERATOR.empty() && priority_cur <= priority_top) {
                	// 如果还有操作符,并且当前符号的优先级较低
					// 那么可以先计算栈里的数
                    number=calc();
                    OPERAND.push(number);
                    // 如果还有操作符,获取其优先级
                    if (!OPERATOR.empty()) priority_top = get_priority(OPERATOR.top());
                }
                OPERATOR.push(str[i]);
                i++;
            }
        }
    }

    while (!OPERATOR.empty()) {
        number = calc();
        OPERAND.push(number);
    }

    cout << OPERAND.top() << endl;

    return 0;
}

测试用例

编号 输入 输出
1 1= 1
2 1+2-3= 0
3 (1+2)*3= 9
4 1-(2+3)*4/5= -3
5 (9+8-7*6/5+(3-2))= 10
6 (100)= 100
7 (((0+31)-4)*50)/6= 225
8 (((100000000+31)-4)*50)/6000= 833333
9 (99999999-20)/300+365+24*12+(32767*5)= 497821
10 (((9*9)*9)*9)/10/10+(100*100*100*100-100)/900+1000000= 1111176
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章