使用栈计算后缀表达式
2015-08-07 21:44
281 查看
什么叫后缀表达式
使用栈的数据结构来计算后缀表达式
代码
在后缀表达式中,操作符位于两个操作数之后,表示如下:
使用栈的数据结构来计算后缀表达式
代码
1.算数表达式可以写成中缀表达式,即操作符位于操作数之间,表示如下:
<操作数><操作符><操作数> 例如:4 + 5
在后缀表达式中,操作符位于两个操作数之后,表示如下:
<操作数><操作数><操作符> 例如: 5 3 -
2.后缀表达式比中缀表达式更容易计算,因为它不用考虑优先规则和括号。表达式中的数值和操作符顺序就足以确定计算结果。因此,程序设计语言编辑器和运行时环境在其内部计算中往往使用后缀表达式。
给出本次计算例子:(3*4-(2+5))*4/2 其等价的后缀表达式为:3 4 * 2 5 + - 4 * 2 / 后缀表达式计算规则: 从左到右扫描,把每个操作符应用到其之前的两个紧邻操作符,并用该计算结果替代该操作符,重复直到剩下最后一个值,也就是计算结果。
计算过程
3 4 * 2 5 + - 4 * 2 / |
---|
12 2 5 + - 4 * 2 / |
12 7 - 4 * 2 / |
5 4 * 2 / |
20 2 / |
10 |
代码块
测试类: package com.cn.stack; import java.util.Scanner; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str1,again; int result; PostfixEvaluator pe=new PostfixEvaluator(); Scanner in=new Scanner(System.in); do { System.out.println("请输入后缀表达式,例如3 4 -6 4 * +等 :"); str1=in.nextLine(); result=pe.evaluate(str1); System.out.println(); System.out.println("最终得值:"+result); System.out.println("Another more?[Y/N]"); again=in.nextLine(); System.out.println(); }while(again.equalsIgnoreCase("Y")); } } 实现类: package com.cn.stack; import java.util.Scanner; import java.util.Stack; public class PostfixEvaluator { private Stack<Integer> stack; //因为栈被设计用来存储对象的,而不是int型基本数值,所以需要使用java.util.Stack的一个Integer实例 public PostfixEvaluator(){ stack=new Stack<Integer>(); } /* * 本方法要注意的是当遇到操作符是,就用它来计算,并不将操作符压入栈中 */ public int evaluate(String string) { int op1,op2,result=0; //result是用来存储计算结果的 String token; //token为每一个字符临时值,即可代表操作符,又可代表操作数 Scanner parser=new Scanner(string); while (parser.hasNext()){ token=parser.next(); if(isOperator(token)){ //如果是加减乘除操作符的话,即弹出两个操作数 op2=(stack.pop()).intValue(); op1=(stack.pop()).intValue(); result=evaluateSingleOperator(token,op1,op2); stack.push(new Integer(result)); }else{ //如果不是操作符,那就是操作数了,压入栈中 stack.push(new Integer(Integer.parseInt(token))); } } return result; } private int evaluateSingleOperator(String operation, int op1, int op2) { //加减乘除四种运算 int result=0; switch(operation) { case "+": result=op1+op2; break; case "-": result=op1-op2; break; case "*": result=op1*op2; break; case "/": result=op1/op2; } return result; } private boolean isOperator(String token){ //判断是否为加减乘除操作符 return (token.equals("+")||token.equals("-")||token.equals("*")||token.equals("/")); } }
相关文章推荐
- 杭电ACM1302——The Snail
- Android系统Burpsuit实现抓https数据包
- Spring先进的交易管理困难剖析
- 安装并配置sonar
- HDU 4281 Judges' response(状压DP)
- 欧几里德算法
- gdb 多线程调试 http://www.cnblogs.com/xuxm2007/archive/2011/04/01/2002162.html
- 《JavaScript》——面向对象之继承
- JavaScript的简单复习
- #每日Linux小练习#04 find指令
- 航电 2212 java AC
- 黑马程序员---OC基础补充---补充:copy与mutableCopy、单例模式
- c++之const,reference(引用),
- 今天一天都在忙论文的事情,所以今天没时间来学习c++,那就给大家带来一个简单小程序杨辉三角把
- 安装vs2012详细步骤
- Codeforces Gym 100418K Cards 组合数学
- centos install (PHP+Mysql+apache)
- 写在博客开始前
- mysql 备份工具xtrabackup(二)
- uva live 3516 Exploring Pyramids 区间DP