经典白话算法之中缀表达式和后缀表达式

一、后缀表达式求值

后缀表达式也叫逆波兰表达式,其求值过程可以用到栈来辅助存储。

假定待求值的后缀表达式为:6  5  2  3  + 8 * + 3  +  *,则其求值过程如下:

(1)遍历表达式,遇到的数字首先放入栈中,依次读入6 5 2 3 此时栈如下所示:

(2)接着读到“+”,则从栈中弹出3和2,执行3+2,计算结果等于5,并将5压入到栈中。

(3)然后读到8(数字入栈),将其直接放入栈中。

(4)读到“*”,弹出8和5,执行8*5,并将结果40压入栈中。

而后过程类似,读到“+”,将40和5弹出,将40+5的结果45压入栈...以此类推。最后求的值288。

代码:

[cpp] view
plain
copy

  1. #include<iostream>
  2. #include<stack>
  3. #include<stdio.h>
  4. #include<string.h>
  5. using namespace std;
  6. int main(){
  7. string PostArray;
  8. int len,i,a,b;
  9. while(cin>>PostArray){
  10. stack<int> Stack;
  11. len = PostArray.length();
  12. for(i = 0;i < len;i++){
  13. //跳过空格
  14. if(PostArray[i] == ‘ ‘){
  15. continue;
  16. }
  17. //如果是数字则入栈
  18. if(PostArray[i] >= ‘0‘ && PostArray[i] <= ‘9‘){
  19. Stack.push(PostArray[i] - ‘0‘);
  20. }
  21. //如果是字符则从栈读出两个数进行运算
  22. else{
  23. //算数a出栈
  24. a = Stack.top();
  25. Stack.pop();
  26. //算法b出栈
  27. b = Stack.top();
  28. Stack.pop();
  29. //进行运算(+ - * /)
  30. if(PostArray[i] == ‘+‘){
  31. Stack.push(a + b);
  32. }
  33. else if(PostArray[i] == ‘-‘){
  34. Stack.push(a - b);
  35. }
  36. else if(PostArray[i] == ‘*‘){
  37. Stack.push(a * b);
  38. }
  39. else if(PostArray[i] == ‘/‘){
  40. Stack.push(a / b);
  41. }
  42. }
  43. }//for
  44. printf("%d\n",Stack.top());
  45. }//while
  46. return 0;
  47. }

经典白话算法之中缀表达式和后缀表达式,布布扣,bubuko.com

时间: 2024-10-11 08:53:53

经典白话算法之中缀表达式和后缀表达式的相关文章

计算器核心算法——中缀表达式转为后缀表达式

中缀表达式转后缀表达式的过程类似编译过程——四则运算表达式中的括号必须匹配——根据运算符优先级进行转换——转换后的表达式中没有括号——转换后可以顺序的计算出最终结果 这是某位伟人研究出的算法,在这里我们直接拿来用就可以. 转换过程:——当前元素e为数字:输出——当前元素e为运算符:1.与栈顶运算符进行优先级比较2.小于等于:将栈顶元素输出,转13.大于:将当前元素e入栈 ——当前元素e为左括号:入栈——当前元素e为右括号:1.弹出栈顶元素并输出,直至栈顶元素为左括号2.将栈顶的左括号从栈中弹出

中缀表达式与后缀表达式

计算中缀表达式"可以称得上是一个特别经典的关于栈的算法题,几乎在所有数据结构教材中都会涉及,而且很多公司面试或者笔试的时候都会把这道题作为一个考察点.可以说,这是一道必须要掌握的算法题.中缀表达式.后缀表达式等概念在这里就不赘述了,让我们直奔主题.题目:输入一个中缀表达式,计算其结果.输入的前提假设:(1)只考虑+.-.*./这四种运算符,中缀表达式中只有一种括号:():(2)输入的中缀表达式中只有整数,没有小数:(3)假定输入是合法的.很多文章或课本喜欢一步到位,直接讨论如何从中缀表达式计算结

栈的应用之中缀表达式转后缀表达式

1,中缀表达式的定义及为什么要将中缀表达式转换为后缀表达式? 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值.对计算机来说,计算前缀或后缀表达式的值要比中缀表达式简单. 比如,计算机计算后缀表达式的过程如下----后缀表达式的计算机求值: 从左

数据结构中缀表达式转后缀表达式以及后缀转中缀表达式

最近一直在看数据结构这本书,我相信,对于每个程序员来说,数据结构都尤为重要.为什么要学,可以看看这位博友的认识http://blog.csdn.NET/sdkfjksf/article/details/54380659 直入主题:将中缀表达式转为后缀表达式 以及将后缀表达式转为前缀表达式的实现. 关于后缀转中缀,中缀转后缀的理论介绍,请先阅读其互转的理论知识,或者我转发的这篇文章,这里不再累赘,最好参考<数据结构与算法描述Java语言版>,接下来将会用java写. 一.首先,怎么实现中缀表达式

表达式的计算(中缀表达式转为后缀表达式或逐步计算)

算数表达式的计算,也是很基础的一个问题.花了点时间写了下. 网上很多正确代码.但没有详细说明.虽然不复杂,但是还是写详细点.只有仔细思考过.问题才会在头脑中,觉得简单. 基本有2种方法. 1)中缀表达式转为后缀表达式,是最简洁有力的方法. 2)符合人的计算思路的逐步方法,不推荐使用,只适合锻炼下逻辑能力. 一.中缀表达式转为后缀表达式,是最简洁有力的方法. //更简洁通用的算法,就是把中缀表达式转换为后缀表达式.后缀表达式:不包含括号,运算符放在两个运算对象的后面. //一,无括号的n级符号算法

中缀表达式到前缀表达式和后缀表达式

1.算法思路 转化为后缀:从左到右遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于等于当前操作符的操作符,当前操作符进栈. 转化为前缀:从右到左遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于等于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于当前操作符的操作符,当前操作符进栈.--参考该网址 以上方法需要先定义操作符优先级,当然,可以定义.但是这样会麻烦许多,那么不如用括号来进行进行限定.这样就不需要写判断

Java版 中缀表达式转换为后缀表达式并求结果

基础知识 平时我们所说的一个算术表达式,例如:9+(3-1)*3+10/2即为中缀表达式,然而计算机无法计算中缀表达式的值,这是因为计算机无法进行带有左右括号和运算符的优先级这种混合运算.后缀表达式(又称 逆波兰式)的使用解决了上述问题. 上述的算术表达式的后缀表达式为:9 3 1 - 3 * + 10 2 / + 算法思想 如何计算上述后缀表达式的结果呢? 答案:从左到右扫描上述后缀表达式,然后: 1. 遇到数字入栈 2. 遇到运算符 将栈顶的前两个元素出栈,然后计算结果,并将计算的结果入栈

java中缀表达式转后缀表达式

四则运算是栈的重要应用之一 中缀表达式转后缀表达式(逆波兰算法)过程 从左到右遍历中缀表达式 数字直接输出为后缀表达式一部分 如果是符号,则判断与栈顶元素的优先级 高于栈顶元素优先级直接入栈 低于或等于栈顶优先级栈顶元素出栈并输出为后缀表达式一部分(注意这里是递归比较栈顶元素的优先级并出栈),最后将当前元素入栈直到遍历完中缀表达式,最终输出后缀表达式 下面是自己的实现源码 package com.yhq.demospringboot; import org.apache.commons.lang

中缀表达式转后缀表达式(Java代码实现)

后缀表达式求值 后缀表达式又叫逆波兰表达式,其求值过程可以用到栈来辅助存储.例如要求值的后缀表达式为:1 2 3 + 4 * + 5 -,则求值过程如下: 遍历表达式,遇到数字时直接入栈,栈结构如下 2. 接着读到 “+”操作符,则将栈顶和次栈顶元素出栈与操作符进行运算,执行 2 + 3操作,并将结果5压入栈中,此时栈结构如下 3.  继续读到4,是数字则直接压栈,此时栈结构如下 4. 继续向后读取,此时读取到操作符“*”,则将栈顶和次栈顶元素出栈与操作符进行运算,即执行 5 * 4 ,然后将结