千家信息网

Java中如何利用栈使用简易计算器

发表于:2025-02-19 作者:千家信息网编辑
千家信息网最后更新 2025年02月19日,这篇文章主要为大家展示了"Java中如何利用栈使用简易计算器",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中如何利用栈使用简易计算器"这篇文章吧。
千家信息网最后更新 2025年02月19日Java中如何利用栈使用简易计算器

这篇文章主要为大家展示了"Java中如何利用栈使用简易计算器",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"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中如何利用栈使用简易计算器"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

符号 操作符 优先级 表达式 数组 简易 计算器 数字 结果 内容 数据 篇文章 最大 个数 索引 长度 顺序 建一 学习 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网页源码如何存入数据库 海致网络技术 招聘 岳阳市委网络安全和信息化 高级数据库设计题 河南高校国家网络安全宣传周 独立根服务器 测试工作好还是软件开发好 软件开发爱抽烟么 提高网络安全意识的小品 平滑升级表结构变动的数据库 如何下载星宇网站数据库 深南电路软件开发岗是什么单位 绥化服务器哪家好 山东省济南联想服务器销售电话 杭州应用软件开发团队 2020网络安全插图 温州网络安全培训机构 数据库的使用要点 达梦数据库加个字段的命令 mc枪战服务器 广州办公系统软件开发靠谱吗 中级软件开发工程师证多少钱 软件开发设计大学分数线二本 led屏上位机软件开发教程 怎么设置提高手机网络安全 昌平区品质软件开发服务电话 人员离职离岗网络安全 上海嗨皮网络技术有限公司 网络管理信息数据库 前端开发是软件开发吗
0