Java中如何利用栈使用简易计算器
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要为大家展示了"Java中如何利用栈使用简易计算器",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中如何利用栈使用简易计算器"这篇文章吧。
千家信息网最后更新 2025年01月23日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安全错误
数据库的锁怎样保障安全
语言软件开发的基本要求
网络技术人员收入
银川网络安全技术提升
ug数据库怎么加载
帝国时代兵的数据库在哪里
如何在服务器上面建造软件
宁德物联网软件开发
平安科技互联网前端客服专员
手机贷服务器系统迁移改造
数据库中的字段值如何加入换行符
每日新闻的数据库表
中国博硕士论文数据库
数据库user
网络安全初创公司
2020网络安全宣传板报
无线网络技术导论第二版
计算机网络技术实训教案
股票期货软件开发语言
mysql数据库设计规范
警察局网络安全管理是干嘛的
数据库提交图片怎么看
服务器与电脑主机的区别
重生网页游戏租服务器小说
查看smtp服务器
属于mysql数据库的是
吉莱斯商城互联网络科技
中经网统计数据库英文缩写
护苗网络安全课观后感百度
国泰安数据库讲座心得
问题教师数据库