表达式求值(后缀表达式求值:栈)

如: 后缀表达式 "2 3 +=" 等价于中缀表达式: "2+3=" 运算结果为: 5

后缀表达式 "2 5 6 * + 3 -=" 等价于中缀表达式: "2+5*6-3=" 运算结果为: 29

后缀表达式 "1 2 + 8 2 - 7 4 - / *=" 等价于中缀表达式: "(1+2)*(8-2)/(7-4)=" 运算结果为: 6

代码如下:

int priority(char f)//判断‘+’、‘-’、‘*’的优先级
{
    if('+' == f || '-' == f)
    {
        return 1;
    }
    return 2;
}
int calculate(int num1,int num2,int sign)//计算
{
    if('+' == sign)
    {
        return num1 + num2;
    }
    else if('-' == sign)
    {
        return num1 - num2;
    }
    else if('*' == sign)
    {
        return num1 * num2;
    }
    return 0;
}
#include <string.h>
int solve(char* s ) {
    // write code here
    int num_stack[100] = {0};//保存数字和符号(符号对应ASII值)
    char sign_stack[100] = {0};//保存符号
    int num_top = -1;//数字栈下标
    int sign_top = -1;//符号栈下标
    int i = 0;
    int num = 0;//保存数字以及计算结果
    while(i < strlen(s))
    {
        //字符转数字并入栈
        if(s[i] >= '0' && s[i] <= '9')
        {
            num = 0;
            while(s[i] >= '0' && s[i] <= '9')
            {
                num = num*10 + (s[i] - '0');
                i++;
            }
            num_stack[++num_top] = num;
            i--;//上面的小循环i在后一位,但大循环还有一次i++,所以要往回退一个位置
        }
        //符号入栈     ‘)’不入栈
        else if('(' == s[i])
        {
            sign_stack[++sign_top] = s[i];
        }
        else if (')' == s[i])
        {
            while(sign_top != -1)
            {
                if(sign_stack[sign_top] == '(')
                {
                    sign_top--;//每遇到一个‘)’去掉符号栈的一个'('
                    break;
                }
                else //()之间的符号出符号栈入数字栈
                {
                    num_stack[++num_top] = sign_stack[sign_top];
                }
                sign_top--;
            }
        }
        else if ('+' == s[i] || '-' == s[i] || '*' == s[i])
        {
            if(-1 == sign_top)//若符号栈为空,遇到符号之间入栈
            {
                sign_stack[++sign_top] = s[i];
            }
            else //若符号栈不为空,则判断当前符号与前一个符号的优先级
            {
                while(sign_top > -1)
                {
                    //若当前符号优先级高于前一符号,则当前符号入符号栈
                    //否则前一符号出符号栈入数字栈,当前符号入符号栈
                    if('(' == sign_stack[sign_top] || priority(sign_stack[sign_top]) < priority(s[i]))
                    {
                        break;
                    }
                    else
                    {
                        num_stack[++num_top] = sign_stack[sign_top];
                    }
                    sign_top--;
                }
                sign_stack[++sign_top] = s[i];
            }
        }
        i++;
    }
    //将符号栈中剩余的符号出栈,入数字栈
    while(sign_top != -1)
    {
        num_stack[++num_top] = sign_stack[sign_top--];
    }
    while(num_top >= 2)
    {
        //找到数字栈中第一个符号的位置
        for(i = 0;i < num_top;i++)
        {
            if(num_stack[i] == '+' || num_stack[i] == '-' || num_stack[i] == '*')
            {
                break;
            }
        } 
        //计算
        num = calculate(num_stack[i-2], num_stack[i-1], num_stack[i]);
        num_stack[i-2] = num;
        //去除计算过的数字和符号
        for(i = i - 1;i < num_top;i++)
        {
            num_stack[i] = num_stack[i+2];
        }
        num_top -= 2;
    }
    return num;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用、[2]和的内容,可以知道在给定一个后缀表达式(以字符串数组的形式表示),计算后缀表达式可以使用一个操作数。在遍历后缀表达式的过程中,如果遇到操作数,就将其转换为int类型并压入中;如果遇到运算符,就从中弹出两个操作数进行相应的运算,并将结果再次压入中。最后,中剩下的唯一一个元素就是后缀表达式的运算结果。 所以,对于给定的后缀表达式c,可以使用进行。在代码实现中,可以根据引用中给出的代码作为参考,根据后缀表达式的每一项进行遍历,使用一个来保存操作数,并根据遇到的运算符对中的操作数进行相应的运算。最后,返回中剩下的唯一一个元素作为后缀表达式的运算结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [数据结构课设——表达式(c++)](https://download.csdn.net/download/qiuyeyijian/12090623)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [后缀表达式-C++实现](https://blog.csdn.net/LJH132465/article/details/124306629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值