利用栈使用简易计算器(Java实现)

 更新时间:2019年09月25日 15:06:53   作者:dreamer_it  
这篇文章主要为大家详细介绍了Java利用栈实现简易计算器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

题目:使用栈计算类似表达式:5+2*3-2  的计算结果 

提示:简易计算器操作符号限于+,-,*,/的计算

分析思路:

1、创建一个数栈和一个符号栈,数栈用于存放数字,符号栈用于存放符号

2、创建一个索引index,用于遍历表达式

3、扫描表达式,如果是数字直接进入数栈,如果是符号,则需要进行判断。分两种情况,一是当符号栈如果为空,直接将符号入栈。二是不为空,先比较当前栈顶的符号与将要进栈的符号的优先级大小,如果将要进栈的操作符的优先级小,则将数栈的两个数弹出,符号栈的操作符弹出一个,并进行计算,计算之后的结果直接进入数栈,如果优先级大,就直接进栈。

4、扫描完表达式之后,就顺序的从数栈和符号栈顺序的弹出相应的数字和操作符,并进行计算。

5、当符号栈为空时,说明已经计算完了,此时留在数栈的只有一个数字,就是表达式计算之后的结果。

代码实现

package cn.mrlij.stack;
 
import java.util.Arrays;
import java.util.Scanner;
 
/**
 * 使用数组实现栈
 *
 * @author dreamer
 *
 */
public class ArrayStackDemo {
  public static void main(String[] args) {
   String express = "5011+2*3-2";
   int index = 0;//定义一个索引值,用于遍历表达式
    int num1 = 0;
    int num2 = 0;
    int res = 0;//计算结果
    char ch = ' ';
    int oper = 0;
    String keepNum = "";
    ArrayStack numStack = new ArrayStack(10);//创建一个数栈
    ArrayStack operStack = new ArrayStack(10);//创建一个符号栈
    while (true){
      ch = express.substring(index,index+1).charAt(0);//不停的遍历操作符
      //判断是否是操作符
      if (operStack.isOper(ch)){
        //判断当前符号栈是否有符号存在
        if(!operStack.isEmpty()){
          //不为空则判断优先级
          if(operStack.priority(ch)<=operStack.priority(operStack.peek())){
            //当优先级小于栈顶的值时候,弹出两个数栈的值进行计算
            num1 = numStack.pop();
            num2 = numStack.pop();
            oper = operStack.pop();
            res = operStack.cal(num1,num2,oper);
            //计算以后将计算得到的值放入数栈
            numStack.push(res);
            //同时将此时的操作符放入符号栈
            operStack.push(ch);
          }else{
            //优先级
            operStack.push(ch);
          }
        }else{
          //为空直接将符号入栈
          operStack.push(ch);
        }
      }else {
        keepNum += ch;
        //处理多位数
        if(express.length()-1 == index){
          numStack.push(Integer.parseInt(keepNum));
        }else {
          if(operStack.isOper(express.substring(index+1,index+2).charAt(0))){
            numStack.push(Integer.parseInt(keepNum));
            keepNum = "";
          }
        }
        // numStack.push(ch-48);
      }
      index++;
      if(index >= express.length()){
        break;
      }
    }
    //扫描完之后,将数栈的值,与操作符中的值进行计算
    while (true){
      if(operStack.isEmpty()){
        break;
      }
      num1 = numStack.pop();
      num2 = numStack.pop();
      oper = operStack.pop();
      res = operStack.cal(num1,num2,oper);
      numStack.push(res);
    }
    System.out.println("表达式:"+express+"="+numStack.pop());
  }
}
 
class ArrayStack {
  private int MaxSize;// 定义数组的最大长度
  private int[] arr;// 定义数组,数据就放在该数组
  private int top = -1;// 定义栈顶,初始化数据为-1
 
  public ArrayStack(int maxSize) {
    this.MaxSize = maxSize;
    arr = new int[MaxSize];
  }
 
  // 判断数组是否为空
  public boolean isEmpty() {
 
    return top == -1;
  }
 
  // 判断数组是否满了
  public boolean isFull() {
    //System.out.println("栈顶:" + top + "最大长度:" + MaxSize);
    return top == MaxSize - 1;
  }
  //取出棧頂元素
  public int peek(){
    return arr[top];
  }
  // 进栈
  public void push(int val) {
    // 先判断栈是否满了,满了就不能添加进去
    if (isFull()) {
      System.out.println("栈已经满了~~");
      return;
    }
    top++;
    arr[top] = val;
  }
 
  // 出栈
  public int pop() {
    // 先判断栈是否为空
    if (isEmpty()) {
      throw new RuntimeException("栈为空,无法出栈!");
    }
    int val = arr[top];
    top--;
    return val;
  }
 
  public void show() {
    if (isEmpty()) {
      System.out.println("没有数据");
      return;
    }
    for (int i = top; i >= 0; i--) {
      System.out.print(arr[i] + "\t");
    }
    System.out.println();
  }
 
  /**
   * 判断是否是一个操作符
   * @param oper 传入的字符
   * @return 如是操作符返回true,否则返回false
   */
  public boolean isOper(char oper){
    return oper == '+' || oper == '-' || oper =='*' || oper == '/';
  }
 
  /**
   * 判断操作符的优先级
   * @param oper 传入的优先级
   * @return 返回优先级 分别是1,-1,0
   */
  public int priority(int oper ){
    if(oper == '*' || oper == '/'){
      return 1;
    } else if(oper == '+' || oper == '-'){
      return 0;
    }else {
      return -1;
    }
  }
 
  //计算方法
  public int cal(int num1,int num2,int oper){
    int res = 0;
    switch (oper){
      case '+': res = num1 + num2;
      break;
      case '-': res = num2 - num1;
      break;
      case '*': res = num1 * num2;
      break;
      case '/': res = num2 /num1;
    }
    return res;
  }
}

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java中使用BeanMap将对象转为Map详解

    Java中使用BeanMap将对象转为Map详解

    这篇文章主要介绍了Java中使用BeanMap将对象转为Map详解,BeanMap 是 Apache Commons BeanUtils 库中的一个类,BeanMap 可以将 Java 对象的属性作为键,属性值作为对应的值,存储在一个 Map 中,它提供了一种将 Java 对象转换为 Map 的方式,需要的朋友可以参考下
    2024-01-01
  • Java正则环视和反向引用功能与用法详解

    Java正则环视和反向引用功能与用法详解

    这篇文章主要介绍了Java正则环视和反向引用功能与用法,结合实例形式较为详细的分析了java正则环视与反向引用的相关概念与使用方法,需要的朋友可以参考下
    2018-01-01
  • Java IDEA集成开发工具中英文切换图文教程

    Java IDEA集成开发工具中英文切换图文教程

    相信很多小伙伴们刚接触IDEA时,看到一堆英文界面不知道如何下手,这篇文章主要给大家介绍了关于Java IDEA集成开发工具中英文切换的相关资料,需要的朋友可以参考下
    2024-04-04
  • 使用Autowired为什么会被IDEA警告最佳修改方法

    使用Autowired为什么会被IDEA警告最佳修改方法

    这篇文章主要介绍了使用Autowired为什么会被IDEA警告,应该怎么修改最佳,除了使用@Autowired以外,我们其实也有几种好用的方式,使用@Resource替代@Autiwired方法是其中一种,只需要改变一个注解,这里就不展示了,需要的朋友可以参考下
    2023-02-02
  • 多数据源@DS和@Transactional实战

    多数据源@DS和@Transactional实战

    这篇文章主要介绍了多数据源@DS和@Transactional实战,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java之CSV大批量数据入库的实现

    java之CSV大批量数据入库的实现

    本文主要介绍了java之CSV大批量数据入库的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Java中的跨域和@CrossOrigin注解的作用详解

    Java中的跨域和@CrossOrigin注解的作用详解

    这篇文章主要介绍了Java中的跨域和@CrossOrigin注解的作用详解,跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制,需要的朋友可以参考下
    2023-12-12
  • Jasypt对SpringBoot配置文件加密

    Jasypt对SpringBoot配置文件加密

    数据库密码直接明文写在配置中,对安全来说,是一个很大的挑战。一旦密码泄漏,将会带来很大的安全隐患。尤其在一些企业对安全性要求很高,因此我们就考虑如何对密码进行加密。本文着重介绍Jasypt对SpringBoot配置文件加密。
    2021-05-05
  • JavaWeb框架MVC设计思想详解

    JavaWeb框架MVC设计思想详解

    这篇文章主要介绍了JavaWeb框架MVC设计思想详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • 浅谈spring-boot的单元测试中,@Before不被执行的原因

    浅谈spring-boot的单元测试中,@Before不被执行的原因

    这篇文章主要介绍了浅谈spring-boot的单元测试中,@Before不被执行的原因,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04

最新评论