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

前缀、中缀、后缀表达式开宗明义,首先搞清楚概念前缀表达式(波兰表达式):运算符位于操作数之前,如*34中缀表达式(常见数学表达式):如(3+4)*5后缀表达式(逆波兰表达式):如34+5*如何将中缀表达式转换为逆波兰表达式算法:使用两个栈,一个符号栈,一个运算栈具体计算规则如下:1.数字直接入队列2.运算符要与栈顶元素比较 ①栈为空直接入栈 ②运算符优先级大于栈顶元素优先级则直接入栈 (这里一定注意是优先级大于才可入栈,你可以在网上看到各种抄袭版本,都是大于等于,错都很一致,误
摘要由CSDN通过智能技术生成

前缀、中缀、后缀表达式

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

  • 前缀表达式(波兰表达式):运算符位于操作数之前,如*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]
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值