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

一、后缀表达式求值

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

假定待求值的后缀表达式为: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.   
  7. int main(){  
  8.     string PostArray;  
  9.     int len,i,a,b;  
  10.     while(cin>>PostArray){  
  11.         stack<int> Stack;  
  12.         len = PostArray.length();  
  13.         for(i = 0;i < len;i++){  
  14.             //跳过空格  
  15.             if(PostArray[i] == ' '){  
  16.                 continue;  
  17.             }  
  18.             //如果是数字则入栈  
  19.             if(PostArray[i] >= '0' && PostArray[i] <= '9'){  
  20.                 Stack.push(PostArray[i] - '0');  
  21.             }  
  22.             //如果是字符则从栈读出两个数进行运算  
  23.             else{  
  24.                 //算数a出栈  
  25.                 a = Stack.top();  
  26.                 Stack.pop();  
  27.                 //算法b出栈  
  28.                 b = Stack.top();  
  29.                 Stack.pop();  
  30.                 //进行运算(+ - * /)  
  31.                 if(PostArray[i] == '+'){  
  32.                     Stack.push(a + b);  
  33.                 }  
  34.                 else if(PostArray[i] == '-'){  
  35.                     Stack.push(a - b);  
  36.                 }  
  37.                 else if(PostArray[i] == '*'){  
  38.                     Stack.push(a * b);  
  39.                 }  
  40.                 else if(PostArray[i] == '/'){  
  41.                     Stack.push(a / b);  
  42.                 }  
  43.             }  
  44.         }//for  
  45.         printf("%d\n",Stack.top());  
  46.     }//while  
  47.     return 0;  
  48. }  
时间: 2024-10-16 04:27:02

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

java数据结构与算法之中缀表达式转为后缀表达式的方法_java

本文实例讲述了java数据结构与算法之中缀表达式转为后缀表达式的方法.分享给大家供大家参考,具体如下: //stack public class StackX { private int top; private char[] stackArray; private int maxSize; //constructor public StackX(int maxSize){ this.maxSize = maxSize; this.top = -1; stackArray = new char[

利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Data Structures>> # Release 3.0 # chengang882 @ 2016-12-20 # 它可以将常见的中缀表达式转换成后缀表达式,并计算这个表达示的值 # Completed implementation of a stack ADT #数据结构 class Stac

php四则运算:中缀表达式转后缀表达式例子

四则运算表达式,我们书面使用的叫做中缀表达式,而计算器,却更加喜欢后缀表达,括号优先级,加减乘除优先级等使得运算中缀四则表达式变得困难.这个时候引入了一种计算机喜欢的格式,叫做后缀表达式.本文以PHP代码,实现中缀表达式转后缀表达式的逻辑.     本文以PHP为代码环境,有人会说高级语言直接写表达式就好了,它们会算,可是他们为什么会算,怎么算的,还是需要把中缀表达式转为后缀表达式.因此本文代码只是模拟一个逻辑.     比如:传统的四则运算表达式(中缀表达式)是9 + ( 3 - 1 ) *

[导入]中缀表达式转换为后缀表达式(C)

中缀表达式向后缀表达式转换文章来源:http://blog.csdn.net/chsword/archive/2007/03/02/1518999.aspx

数据结构Java实现06----中缀表达式转换为后缀表达式

本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 *.又比如3+(6-4/2)*5=23的后缀表达式为:3642/-5*+# (#符号为结束符) 前缀表达式:同后缀表达式一样,不包含括号,运算符放在两个

详解C++编程中的主表达式与后缀表达式编写基础_C 语言

主表达式主表达式是更复杂的表达式的构造块.它们是文本.名称以及范围解析运算符 (::) 限定的名称.主表达式可以具有以下任一形式: literal this :: name name ( expression ) literal 是常量主表达式.其类型取决于其规范的形式. this 关键字是指向类对象的指针.它在非静态成员函数中可用,并指向为其调用函数的类的实例. this 关键字只能在类成员函数体的外部使用. this 指针的类型是未特别修改 this 指针的函数中的 type *const(

【算法与数据结构】中缀表达式转为后缀表达式

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.题目介绍     中缀表达式是将运算符放在运算数中间的写法,如a+b*c.后缀表达式是将运算符放在运算数后面,如abc*+. 2.代码实现部分 import java.util.Stack; public class Main { private String testString = null; private Stack<Character> stack = null; public Main(St

经典白话算法之桶排序

最快最简单的排序--桶排序 在我们生活的这个世界中到处都是被排序过的.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序--总之很多东西都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎考的真是惨不忍睹(满分是10分).接下来将分数进

经典白话算法之冒泡排序

 简化版的桶排序不仅仅有上一节所遗留的问题,更要命的是:它非常浪费空间!例如需要排序数的范围是0~2100000000之间,那你则需要申请2100000001个变量,也就是说要写成int a[2100000001].因为我们需要用2100000001个"桶"来存储0~2100000000之间每一个数出现的次数.即便只给你5个数进行排序(例如这5个数是1,1912345678,2100000000,18000000和912345678),你也仍然需要2100000001个"桶&