C++——转换标准函数式为逆波兰表达式并计算结果

本文介绍了如何将中缀表达式转换为逆波兰表达式,并提供了C++实现。转换过程中使用两个栈,一个用于运算符,另一个用于运算数。详细讲解了转换规则,并特别强调了运算符优先级的比较。此外,还讨论了处理复杂表达式时的预处理步骤,以及逆波兰表达式的计算顺序。

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

前缀、中缀、后缀表达式

开宗明义,首先搞清楚概念

  • 前缀表达式(波兰表达式):运算符位于操作数之前,如*34
  • 中缀表达式(常见数学表达式):如(3+4)*5
  • 后缀表达式(逆波兰表达式):如34+5*

如何将中缀表达式转换为逆波兰表达式

算法:
使用两个栈,一个符号栈,一个运算栈
具体计算规则如下:
1.数字直接入队列
2.运算符要与栈顶元素比较
 ①栈为空直接入栈
 ②运算符优先级大于栈顶元素优先级则直接入栈
(这里一定注意是优先级大于才可入栈,你可以在网上看到各种抄袭版本,都是大于等于,错都很一致,误人子弟)
 ③小于或等于则出栈入列,再与栈顶元素进行比较,直到运算符优先级小于栈顶元素优先级后,操作符再入栈
3.操作符是 ( 则无条件入栈
4.操作符为 ),则依次出栈入列,直到匹配到第一个(为止,此操作符直接舍弃,(直接出栈舍弃

最后将符号栈中剩余元素压入计算栈中,要注意的是,此时需要对计算栈的次序逆序输出才为正确的逆波兰式。

代码实现 C++

int priority(char c)   //定义优先级
{
   
   switch(c)
   {
   
     case '+':
           return 1;
     case '-':
            return 1;
     case '*':
           return 2;
     case '/':
          return 2;
    default :
        return 0;
   }
}

stack<string> RPN(string s){
   
    stack<string> sta;
    stack<char> ops;
    int n = s.size();
    for(int i=0;i<n;i++){
   
        //若为连续数字,则连续读取
        if(s[i]>='0'&&s[i]<='9'){
   
            int curnum = s[i]-'0';
            int j = i+1;
            while(s[j]>='0'&&s[j]<='9'){
   
                curnum = curnum*10 + (s[j]-'0');
                j++;
            }
            i=j-1;
            sta.push(to_string(curnum));
        }
        //左括号直接进入符号栈
        else if(s[i]=='('){
   
            ops.push(s[i]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值