您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java数据结构和算法——栈(stack)实现综合计算器的应用示例

小志的博客 发布时间:2020-07-27 22:45:44 ,浏览量:0

一、栈(stack)实现综合计算器的思路分析

在这里插入图片描述

二、栈(stack)实现综合计算器的代码示例

1、代码

package com.rf.springboot01.dataStructure.stack.calculatorStack;

/**
 * @description: 栈(stack)实现综合计算器
 * @author: xiaozhi
 * @create: 2020-07-27 13:45
 */
public class Calculator {

    public static void main(String[] args) {
        //定义一个表达式
        String expre = "70+2*6-2";
        int res=getResult(expre);
        System.out.printf("表达式 %s=%d",expre,res);
    }

    /** 
    * @Description: 计算器获取运算结果方法
    * @Param: [expre] 
    * @Author: xz  
    * @return: int
    * @Date: 2020/7/27 22:13  
    */ 
    public static int getResult(String expre){
        //创建一个数栈,一个符号栈
        CalculatorArrayStack numStack = new CalculatorArrayStack(10);
        CalculatorArrayStack operStack = new CalculatorArrayStack(10);
        int index=0;//用于扫描
        int num1=0;//定义第一个数
        int num2=0;//定义第二个数
        int oper=0;//定义操作符
        int result = 0;//定义返回结果
        char ch = ' ';//将每次扫描得到char保存到ch
        String keepNum = ""; //用于拼接 多位数
        //开始while循环的扫描expression
        while(true){
            //依次得到expre的每一个字符
            ch=expre.substring(index,index+1).charAt(0);
            if(operStack.isOper(ch)){//是运算符
                if(!operStack.isEmpty()){//符号栈不为空
                    //操作符的优先级小于或者等于栈中的操作符
                    if(operStack.priority(ch)=expre.length()){
                break;
            }
        }
        //当表达式扫描完毕,就顺序的从 数栈和符号栈中pop出相应的数和符号,并运行.
        while(true){
            //如果符号栈为空,则计算到最后的结果, 数栈中只有一个数字【即结果】
            if(operStack.isEmpty()){
                break;
            }
            num1=numStack.pop();
            num2=numStack.pop();
            oper=operStack.pop();
            result=numStack.compute(num1,num2,oper);
            numStack.push(result);//入栈
        }

        //将数栈的最后数,pop出,就是结果
        return  numStack.pop();
    }
}


/** 
* @Description: 定义一个数组栈 
* @Param:  
* @Author: xz  
* @return: 
* @Date: 2020/7/27 22:45  
*/ 
class CalculatorArrayStack{

    private int maxSize;//栈的最大值
    private int[] stack; //数组类型的栈
    private int top=-1;//栈顶

    public CalculatorArrayStack(int maxSize){
        this.maxSize=maxSize;
        stack=new int[maxSize];//数组类型的栈初始化
    }

    //栈是否已满
    public boolean isFull(){
        return top==maxSize-1;
    }

    //栈是否为空
    public boolean isEmpty(){
        return  top==-1;
    }

    //入栈
    public void push(int value){
        if(isFull()){
            System.out.println("栈已满");
            return;
        }
        top++;
        stack[top]=value;
    }
    
	//出栈
    public int pop(){
        if(isEmpty()){
            throw  new RuntimeException("栈为空");
        }
        int value=stack[top];//获取到栈顶的值
        top--;
        return value;
    }

    //显示栈顶的值,不出栈
    public int peek(){
        return  stack[top];
    }

    //遍历栈,从栈顶开始显示数据
    public void list(){
        if(isEmpty()){
            throw  new RuntimeException("栈为空");
        }
        for(int i=top;i>=0;i--){
            System.out.printf("stack[%d]=%d \n",i,stack[i]);
        }
    }

   //返回运算符的优先级,优先级自己确定(数字越大,则优先级就越高)
   //假定目前的表达式只有 +, - , * , /
    public int priority(int oper){
        if(oper == '*' || oper== '/'){
            return 1;
        }else if(oper == '+'|| oper == '-'){
            return 0;
        }else {
            return -1;
        }
    }

    //判断是否是一个运算符
    public boolean isOper(char val){
        return val=='*' || val=='/' || val=='+'|| val== '-';
    }

    //计算方法
    public int compute(int num1,int num2,int oper){
        int result=0;
        switch(oper){
            case '+':
                result=num1+num2;
                break;
            case '-':
                result=num2-num1;
                break;
            case '*':
                result=num1*num2;
                break;
            case '/':
                result=num1/num2;
                break;
            default:
                break;
        }
        return result;
    }
}
关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0525s