中序表达式转后序(计算版)

本文修正了中序表达式转换为后序表达式的算法,并提供了详细的步骤及改进后的代码实现,支持加减乘除运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前写了一个中序表达式转后序表达式,今天发现有一部分是错的,现在进行更正:

而关于如何将中序表达式转为后序表达式。可以参考上面的做法,建立两个栈s1和s2,s1存储后序表达式的结果,s2存储运算符号。从左到右遍历,如果当前符号是数字则推入s1,如果当前符号是”(“推入s2,如果当前符号是”)”,将(之前的符号都弹出,推入s1;如果当前符号的优先级大于s2的顶部,则推入栈,否则一直弹出直到当前符号的优先级大于等于s2的顶部。最后把s2的所有符号都推入s1。

这里有一些错误,如果当前栈顶计算符号的优先级大于等于的当前计算符号,则弹出进行计算,直到栈为空或栈顶的计算符号小于当前计算符号上次没有注意这一点,所以有一点错误。现在进行更正。更正后的代码如下:
相关问题描述可以参见https://leetcode.com/problems/basic-calculator/#/description
不过这里我进行了改进可以计算加减乘除。
代码如下:

class Solution {
public:
    //改进版可以计算加减乘除
    bool compare(char op1, char op2) {  
        if (op1 == '*' || op1 == '/') {  
            if (op2 == '+' || op2 == '-') {  
                return 1;  
            }  
            else {  
                return 0;  
            }  
        }  
        else if (op1 == '+' || op1 == '-') {  
            if (op2 == '*' || op2 == '/') {  
                return -1;  
            }  
            else {  
                return 0;  
            }  
        }  
        return 0;  
    }

    int calNumber(char op, int num1, int num2) {
        if (op == '+') {
            return (num1 + num2);
        }
        else if (op == '-') {
            return (num1 - num2);
        }
        else if (op == '*') {
            return (num1 * num2);
        }
        else if (op == '/') {
            return (num1 / num2);
        }
        return -1;
    }

    int calculate(string s) {
        if (s.size() == 0) {
            return 0;
        }
        stack<int> num;
        stack<char> op;
        int i = 0;
        while (i < s.size()) {
            if (s[i] == ' ') {
                i++;
                continue;
            }
            if (s[i] == '(') {
                op.push(s[i++]);
            }
            else if (s[i] == ')') {
                while (op.top() != '(') {
                    int num2 = num.top();
                    num.pop();
                    int num1 = num.top();
                    num.pop();
                    num.push(calNumber(op.top(), num1, num2));
                    op.pop();
                }
                op.pop();
                i++;
            }
            else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
                while (!op.empty() && compare(op.top(), s[i] ) >= 0 && op.top() != '(') {
                    int num2 = num.top();
                    num.pop();
                    int num1 = num.top();
                    num.pop();
                    num.push(calNumber(op.top(), num1, num2));
                    op.pop();
                }
                op.push(s[i]);
                i++;
            }
            else {
                int n = 0;
                while (i < s.size() && s[i] == ' ') {
                    i++;
                }
                while (i < s.size() && s[i] >= '0' && s[i] <= '9') {
                    n = n * 10 + (s[i++] - '0');
                }
                num.push(n);
            }
        }
         while (!op.empty()) {
            int num2 = num.top();
            num.pop();
            int num1 = num.top();
            num.pop();
            num.push(calNumber(op.top(), num1, num2));
            op.pop();
        }
        return num.top();
    }
};

有时候我问题没想清楚就写博客了,所以会有一些错误,如果大家发现了可以在评论里面告诉我,或者私信我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值