栈还是用的上一篇的数组模拟栈,并在此之上增加了

判断是否是一个运算符的方法

获取运算符的优先级方法

计算结果方法

查看栈顶元素的方法

四个方法,具体代码如下:

package com.ebiz.stack;/*** @author YHj* @create 2019-07-20 14:20* 数组模拟栈*/public class ArrayStack {private  int maxSize;private  int [] arr;  //数组模拟栈   private  int top = -1;//构造方法,初始化数组public ArrayStack(int maxSize) {this.maxSize=maxSize;this.arr = new int[maxSize];}//验证栈满public boolean isFull(){return top == maxSize-1;}//验证为空public boolean isEmpty(){return top == -1;}//入栈public void push(int value){if (isFull()){System.out.println("栈已满");return;}top++;arr[top]=value;}//出栈public int pop(){if(isEmpty()){throw new RuntimeException("栈已空");}int value=arr[top];top--;return value;}//遍历栈public void list(){if (isEmpty()){throw new RuntimeException("栈为空");}while (true){if (isEmpty()){System.out.println("栈为空");break;}System.out.printf("出站元素为%d%n",arr[top]);top--;}}//返回运算符的优先级  优先级用数字表示//数字越大,代表优先级越高// *或者/  优先级为1// +或者-  优先级为0// -1 代表运算符为问题运算符public int priority(int operator){if ('*' == operator || '/' == operator){return 1;}else if ('+' == operator || '-' == operator){return 0;}else{return -1;}}//判断是否为一个运算符public boolean isOperator(char operator){return operator == '+' || operator == '-' || operator == '*' || operator == '/';}//计算方法public int calculator(int num01,int num02,int operator){//用于存放计算结果int result=0;switch (operator){case '+':result = num01+num02;break;case '-':result = num02-num01;break;case '*':result = num01*num02;break;case  '/':result = num02/num01;break;default:break;}return result;}//获取符号栈的栈顶符号,并不是真正取出该元素public int peek() {return arr[top];}
}

下面给出测试,中缀表达式提前给定好,只涉及到了两位数,对于小括号还有小数点后面会将中缀转为后缀,便于计算

package com.ebiz.stack;/*** @author YHj* @create 2019-07-22 11:04* 栈模拟计算器  中缀表达式*/
public class Calculator {public static void main(String[] args) {//表达式//String expression = "50+2*6-2";String expression = "5-2*3+1";//创建数字栈ArrayStack numeStack = new ArrayStack(10);//创建运算符栈ArrayStack operatorStack = new ArrayStack(10);//初始化索引,用于扫描表达式int index = 0;int num01 = 0;int num02 = 0;int operator = ' '; //定义运算符int res =0;      //存放结果char ch =' ';  //将每次扫描得到的char保存到ch// 定义字符串,拼接多位数String str="";while (true){//开始扫描表达式,并判断是数字还是符号ch=expression.substring(index,index+1).charAt(0);//如果为运算符if (operatorStack.isOperator(ch)){//判断符号栈是否为空  符号栈不为空if (!operatorStack.isEmpty()){//判断符号优先级  当前符号优先级小于或者等于符号栈顶的符号的优先级,//从数字栈弹出两个数字,符号栈弹出栈顶符号,进行计算,结果加入数字栈,当前符号加入符号栈if (operatorStack.priority(ch) <= operatorStack.priority(operatorStack.peek())){num01=numeStack.pop();num02=numeStack.pop();operator=operatorStack.pop();//进行计算res=numeStack.calculator(num01,num02,operator);operatorStack.push(ch);numeStack.push(res);}else { //当前符号的优先级大于符号栈顶的符号的优先级,则直接加入符号栈
                        operatorStack.push(ch);}}else { //符号栈为空
                    operatorStack.push(ch);}}else {//不是运算符  直接进入树栈//ASCII表, 查出来的是'1' 对应的十进制为49//numeStack.push(ch-48);//某一字符为多位数时,需要当成字符串处理str+=ch;//判断ch是否为最后一个字符if (index == expression.length()-1){numeStack.push(Integer.parseInt(str));}else {//判断下一位是否是字符,下一位是字符,则将当前拼接字符串存入数字栈if (operatorStack.isOperator(expression.substring(index+1,index+2).charAt(0))){numeStack.push(Integer.parseInt(str));//把str 清空str = "";}}}//继续扫描,索引增加,并判断是否到最后index++;if (index >= expression.length()){break;}}//表达式扫描完毕后,对两个栈中元素进行计算while (true){num01=numeStack.pop();num02=numeStack.pop();operator=operatorStack.pop();numeStack.push(numeStack.calculator(num01, num02, operator));//判断结束if (operatorStack.isEmpty()){break;}}//输出结果System.out.println("result="+numeStack.pop());}}

转载于:https://www.cnblogs.com/jiushixihuandaqingtian/p/11241049.html

数据结构之中缀表达式实现计算器相关推荐

  1. 字符串得结果!Java数组模拟栈以实现中缀表达式综合计算器,字符串表达式计算器

    文章目录 数组模拟栈类 中缀表达式计算器类(测试类) 数组模拟栈类 主要实现栈的一些基本功能,以及在该场景下的功能. //先创建一个栈 class AStack {private int maxSiz ...

  2. 数据结构实验——中缀表达式转为后缀表达式

    一.实验内容: 编写程序,实现中缀表达式化为后缀式输出. 已知中缀表达式中操作数全部用小写英文字母表示,运算符只含有+, -, *, /四种,定界符只有( )以及结束符#. 二.程序源代码: 运行示例 ...

  3. 数据结构——栈——中缀表达式和后缀表达式

    什么是中缀表达式,什么是后缀表达式 我们一般看见的多项式计算都是中缀表达式构成的:1+2*3+4/3 类似这种,为什么说是中缀呢?因为它的计算符号都是在两个数中间的. 那么自然而然的明白了后缀表达式是 ...

  4. 【算法与数据结构】中缀表达式转为后缀表达式

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.题目介绍     中缀表达式是将运算符放在运算数中间的写法,如a+b*c.后缀表达式是将运算符放在运算数后面 ...

  5. Java数据结构之中缀表达式转后缀表达式

    简介 通过数组模拟栈进行中缀表达式转后缀表达式,再进行计算 不说废话,请看代码. package com.atguigu.Stack;import java.util.ArrayList; impor ...

  6. 【数据结构】中缀表达式转前缀表达式求值

    中缀表达式转前缀表达式求值 首先将中缀表达式转换成前缀表达式 前缀表达式中,操作符在前 例如:1+2*(5-3)+4 后缀表达式:++1*2-534 一.转换思路 转换思路为将输入的中缀表达式字符串从 ...

  7. 数据结构之中缀表达式计算

    我们在计算机器中输入"7*2*2-5+1-5+3-4",就能很快得到结果18,那么如何利用栈结构模拟实现计算机呢?下面就来聊聊在编写代码时的思路,注意点以及代码(我只考虑了简单的加 ...

  8. 数据结构之中缀表达式转为后缀

    #include<windows.h> #include<stdio.h> #define MaxSize 50 #define DataType char const int ...

  9. 中缀转后缀表达式,带括号的后缀表达式综合计算器,Java栈数据结构实现

    文章目录 中缀表达式转后缀表达式思路 逆波兰表达式计算思路 代码实现 中缀表达式转后缀表达式思路 1.初始化两个栈:运算符栈s1和储存中间结果的栈s2 2.从左至右扫描中缀表达式 3.遇到操作数时,将 ...

最新文章

  1. 人工智能赋能智慧停车 准确预订车位
  2. [原创]用递归写的一个object 转换成JSON的函数
  3. 谷歌地图最新hosts_如何查看2020最新版谷歌地球高精度卫星地图(附下载方法)...
  4. Jayway JsonPath实例
  5. 【问题】HDFS中块(block)的大小为什么设置为128M?
  6. Qt C++发送图片到QML显示
  7. FaceBook机器学习开源DL模块
  8. leetcode1254. 统计封闭岛屿的数目(dfs)
  9. linux配置端口ipv6地址,linux配置ipv6地址命令
  10. Shiro系列-Authenticator和AuthenticationStrategy是什么
  11. 小程序运行时相关信息
  12. 关于提示对话框的总结
  13. java的实例变量_JAVA语言中的实例变量
  14. win10分辨率设置_雷电模拟器如何设置分辨率
  15. wordpress 占有率_降低WordPress网站跳出率的10条提示
  16. 工商管理专业的毕业论文怎么选题?
  17. 【Shader与ShaderToy 】画一个五角星
  18. win7中USB音箱没有声音解决办法
  19. 春季高考计算机基础知识试题答案,春季高考数学真题
  20. 拯救者r720黑苹果_拯救级手游语音,大象声科助力联想拯救者电竞手机

热门文章

  1. php email 发送,php 发送 Email
  2. python dry原则_关于Python 的这几个技巧,你应该知道
  3. php 开源建站工具 -- 资料收集
  4. WIN10 下 PHP7 中文乱码的解决办法
  5. ubuntu 10.10 修改下载源的方法
  6. Vue DevTools可使用修正方法
  7. C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信
  8. RTP传输H264时的sps和pps的获取
  9. opengl与Directx的区别
  10. 文件指针和文件描述符之间的相互转换 fd----fp 和 fp----fd