Java中如何利用栈使用简易计算器
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要为大家展示了"Java中如何利用栈使用简易计算器",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中如何利用栈使用简易计算器"这篇文章吧。
千家信息网最后更新 2025年11月09日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安全错误
数据库的锁怎样保障安全
传奇数据库在那
创建数据库后怎么创建登录界面
关于服务器的管理
软件开发本科毕业设计
中央网络安全和信息化宋绍泰
omegaT数据库
ntc网络安全资格证书有用吗
泰兴网络技术市场
药店医保数据和网络安全自查表
数据库货币字段类型
浙江洛菲斯网络技术有限公司
云服务器集中管理
电脑系统软件开发
沁阳租房软件开发
网络安全提示用户
台州桌面软件开发流程八个步骤
软件开发的web界面
防网贷网络安全心得体会
服务器计划书
geekbench5 数据库
保管服务器是什么意思
网络安全法是指通过
数据库在未来发展趋势
食物 数据库
服务器怎么展示手中物品
链接蒸汽平台服务器失败
杭州有电脑软件开发培训班
玩游戏只有一个服务器延迟
广州国产化服务器厂商
godaddy数据库备份