利用栈结构计算后缀表达式

后缀表达式?

正常地计算表达式
<操作数> <操作符> <操作数>.
9+2
结果 11

后缀表达式
<操作数> <操作数> <操作符>
9 2 +
结果 11

复杂一点地后缀表达式
3 4 * 2 5 + - 4 * 2 /
计算步骤:
12 2 5 + - 4 * 2 /
12 7 - 4 * 2 /
5 4 * 2 /
20 2 /
10
结果为10

栈结构?
特点:先进后出,后进先出 。。

像子弹夹,子弹一个个从上面装进去,最后打枪地时候,最后装进去地那颗子弹,是最先打出来的。

在这里插入图片描述

栈的一些专业术语:
子弹一个个装进去的过程称为 压栈,
子弹一个个被打出来,称为出栈
栈顶元素:最上方的那个元素(子弹)

栈的一些操作:

操作 描述
push 压栈,压入一个元素
pop 移出栈顶元素
peek 查看栈顶的元素
isempty 确定栈顶元素是否为空
size 确定栈中元素个数

根据栈的结构特性,以及后缀表达式的特点,了解到栈是计算后缀表达式最理想的数据结构

代码说明:
操作数限定为整数,操作符限定为四个符号 + - * /
该程序会反复的计算你输入的表达式,直到你想退出为止。

主类

import java.util.Scanner;

/**
 * 用栈   计算后缀表达式
 *
 * */
public class PostfixTester {
    public static void main(String[] args) {
        String expression,again;
        int result;
        Scanner in=new Scanner(System.in);

        do{
            PostfixEvaluator evaluator=new PostfixEvaluator ();
            System.out.println ("输入一个表达式,每个字符以空格隔开,如:(5 4 + 3 2 1 - + *)");
            System.out.println ("说明:每输入的一个字符,必须是整数或者(+,-,*,/)");
            expression=in.nextLine ();
            result=evaluator.eavluate (expression);
            System.out.println ();
            System.out.println ("答案是:"+result);
            System.out.println ("还需要继续么[Y/N]?");
            again=in.nextLine ();
            System.out.println ();
        }while(again.equalsIgnoreCase ("y"));
	}
}

其余类

import java.util.Scanner;
import java.util.Stack;

public class PostfixEvaluator {
    private final static char ADD='+';
    private final static char SUBTRACT='-';
    private final static char MULTIPLY='*';
    private final static char DIVUDE='/';

    private Stack<Integer> stack;
    /**
     * 构建一个栈来压入 压出 操作数
     *
     * */


    public PostfixEvaluator() {
        stack=new Stack<Integer>();

    }
    /**
     * 计算输入的表达式
     *
     * */
    public int eavluate(String expr){
        int op1,op2,result=0;
        String token;
        Scanner parser=new Scanner (expr);
        //不断扫描输入的表达式子,出栈压栈地计算。
        while(parser.hasNext ()){
            token=parser.next ();
            //如果是那四个操作符,那么就出栈两个元素,进行计算
            if(isOperator (token)){
                op2= (stack.pop()).intValue();
                op1=(stack.pop()).intValue();
                result=evaluateSingleOperator(token.charAt (0),op1,op2);
                stack.push(new Integer(result));
            }
            //如果扫描到不是计算符号,就压栈。
            else{
                 stack.push (new Integer(Integer.parseInt (token)));

            }
        }
        return result;
    }

    private int evaluateSingleOperator(char operation, int op1, int op2) {
        int result=0;
        switch(operation){
            case ADD:
                result=op1+op2;
                break;
            case SUBTRACT:
                result=op1-op2;
                break;
            case MULTIPLY:
                result=op1*op2;
                break;
            case DIVUDE:
                result=op1/op2;
                break;
        }
        return result;
    }
	//判定是不是那四个操作符
    public boolean isOperator(String token){
        return (token.equals("+")||token.equals("-")||token.equals("*")||token.equals("/"));
    }

}

©️2020 CSDN 皮肤主题: 黑客帝国 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值