您的位置:首页 > 其它

使用栈计算后缀表达式

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("/"));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: