Java中如何利用栈使用简易计算器
发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,这篇文章主要为大家展示了"Java中如何利用栈使用简易计算器",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中如何利用栈使用简易计算器"这篇文章吧。
千家信息网最后更新 2024年11月28日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安全错误
数据库的锁怎样保障安全
联想服务器cr51
fm22数据库选择
帝国神话pve如何换服务器
怎么进入阿里云服务器
网络安全路由器和防火墙区别
哈尔滨市小熊软件开发
巢湖服务器回收公司服务至上
北京客邻尚品网络技术有
伍悦橙果软件开发
网络技术专业发展前景分析
网络安全预算项目绩效目标表
网站数据库如何更新
协调服务器
五年日记软件开发
数据库攻击手段
安卓 服务器推送消息
北京软件开发人员有多少
网络安全失泄密自查
网络安全沙盘推演案例
校园网络安全小视频
服务器和电脑哪个更耗电
原神服务器小米服
软件开发交付有哪些资料
针灸百科软件开发者
sql服务器是自带的吗
数据库系统概论题集百度云
表名带空格数据库语句如何操作
深海禁欲服务器进不去
应聘网络安全师简历
保定 软件开发 考证