数据结构-栈和队列(用栈实现表达式求值)

用栈实现表达式求值

小结:“用栈求中缀表达式值”较复杂【已基本搞定】,只要此处搞定,“用栈求前缀/后缀表达式值”,就不是问题;“用栈求前缀表达式值”和“用栈求后缀表达式”部分细节相反,代码描述基本相同。

  • “用栈求中缀表达式值”,需要考虑:算子,运算符,括号,问题;
  • “用栈求后缀/前缀表达式值”,需要考虑:算子,运算符,不需要考虑括号问题;
  • 所以:相比较而言,对于计算机而言,“用栈求后缀/前缀表达式值”,更加高效;
  1. 用栈求中缀表达式值:
    • 原则:
      • 创建两个栈,栈1和栈2;从左到右,依次遍历中缀表达式元素;
      • 遇见算子,入栈1,遇见左括号,入栈2;遇见运算符,待入栈2;
        • 如果栈2空,或者栈2顶部为左括号,运算符直接入栈2;
        • 如果栈2不空,并且栈2顶部不是左括号【那就是运算符或者右括号】:
          • 遍历到的运算符优先级,大于栈2栈顶运算符优先级,入栈;否则,栈2栈顶运算符,依次出栈,直至遍历到的运算符优先级大于栈2中栈顶的优先级;栈2中每出栈一个运算符,对应栈1中,依次出栈2个算子,自右向左排列,并同时利用刚出栈的运算符,进行计算,计算结果入栈1;
          • 遍历到左括号,入栈2;遍历到右括号,则栈2中,至左括号之间的运算符,依次出栈,同时,对应栈1中的算子依次出栈,进行上述运算操作
        • 最终,中缀表达式遍历完之后,如果栈2中还有运算符,则依次出栈,对应栈1中的算子也依次出栈,做如上的运算,并将最终结果压入栈1中,结束。
    • 代码实现:
    •  getPriority函数:传入当前所扫描到的表达式字符,与栈2顶字符优先级相比较,若优先级大,则返回1;否则返回0;

      1.辅助函数1-判断操作符优先级
      int getPriority(char p)
      {
          if(p=='+' || p=='-')      //注意:此处是==,而不是=;此处是'',而不是“”;
             return 0;
          else
             return 1;
      }
      
    •  calSub函数:栈2出栈1个运算符,栈1出栈2个算子,进行计算;若不符合数学计算准则,返回0;否则,返回正常计算结果;

      2.辅助函数2-栈2出栈1个运算符,栈1出栈2个算子,进行计算,返回计算结果
      int calSub(float pand1,char p,float pand2,float & result)  //float & result:算子可能为小数,result需要返回值,所以用引用型;
      //栈2输出一个算子,栈1输出2个运算符,进行计算,结果输出; 
      {
      	if(p=='+') result=pand1+pand2;
      	if(p=='-') result=pand1-pand2;
      	if(p
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值