中缀表达式求值

利用中缀表达式计算表达式
代码如下:

#include <iostream>
#include <stack>
using namespace std;

int get_isp(char ch){
    if (ch == '(') return 1;
	else if (ch == '+' || ch == '-') return 2;
	else if (ch == '*' || ch == '/') return 3;
	else if(ch == ')') return 4;
    else return 0;
}

int get_icp(char ch){
    if (ch == ')') return 1;
	else if (ch == '+' || ch == '-') return 2;
	else if (ch == '*' || ch == '/') return 3;
	else if(ch == '(') return 4;
    else return 0;
}

int is_operator(char ch){
    if(ch - '0' >= 0 && ch - '0' <= 9){  //数字
        return 0;
    }
    else if(ch == '#' || ch == '+' || ch == '-' || ch == '*' || ch == '/' ||ch == '(' || ch == ')'){  //运算符号
        return 1;
    }
    else{
        return -1;  //非法字符
    }
}

int compute(int a, int b, char _operator)
{
    switch(_operator)
    {
        case '+':
            return a + b;
        case '-':
            return a - b;   
        case '*':
            return a * b;  
        case '/':
            return a / b;  
        default:
            return 0;
    }
}

void calculator(){
    stack<int> OPND;  //数值栈
    stack<char> OPTR;  //符号栈
    int i, j, a, b, res;
    char ch, top;
    ch = getchar();
    OPTR.push('#');
    OPND.push(0);  //处理首位为一元运算符的情况

    while(ch != '#' || OPTR.top() != '#'){  //当算式没有结束 或 符号栈还有计算符号时执行
        if(!is_operator(ch)){  //如果是数字 入数字栈
            int m, n;
            n = ch - '0';
            ch = getchar();
            while(!is_operator(ch)){
                m = ch - '0';
                n = n * 10 + m;
                ch = getchar();
            }
            OPND.push(n);  //入栈
            continue;
        }
        else if(is_operator(ch) != -1){  //如果为运算符号 进一步判断
            top = OPTR.top();    //获取栈顶元素
            i = get_isp(top); j = get_icp(ch);  //获取优先级 i代表栈内元素 j代表栈外元素

            if(i < j){  //如果栈内元素优先级小于栈外元素优先级 入符号栈
                OPTR.push(ch);  //入符号栈
                if(top == '(' && (ch == '-' || ch == '-')){  //一元运算符在'('之后的情况
                    ch = getchar();
                    if(is_operator(ch)) continue;  //如果下一位是符号 那么进行下一轮判断
                    else OPND.push(0);  //如果是数字 将0压入数值栈 0 + num = num , 0 - num = -num
                }
            }
            else{
                OPTR.pop();
                if(top != '(' && i == j || i > j){  //如果i >= j并且弹出的元素不是'(' 从数值栈弹出两个元素进行运算 并将结果入栈
                    b = OPND.top();
                    OPND.pop();
                    a = OPND.top();
                    OPND.pop();
                    OPND.push(compute(a, b, top));
                    continue;  //继续计算
                }
            }
        }
        ch = getchar();
    }

    res = OPND.top();
    cout << "计算结果为:" << res << endl;
}

int main(){
    calculator();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值