栈的运用——中缀表达式[Java实现]

news/2025/3/14 5:42:41/

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现,有时候有C/C++代码。
⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢迎指正,一同进步😁

目录

  • 1、实现思路
  • 2、举例实现
  • 3、代码实现
    • 3.1、main方法
    • 3.2、priority(比较优先级)
    • 3.3、isOper(判断运算符)
    • 3.4、cal(计算)
    • 3.4、Stack
    • 3.5、InfixExpression完整代码

先移步到我另外一篇文章,复习一下三种表达式:前缀表达式、中缀表达式、后缀表达式

1、实现思路

使用栈完成中缀表达式的计算思路:

  1. 通过一个 index 值(索引),来遍历我们的表达式
  2. 如果我们发现是一个数字, 就直接入数栈
  3. 如果发现扫描到是一个符号, 就分如下情况
    3.1 如果发现当前的符号栈为 空,就直接入栈
    3.2 如果符号栈有操作符,就进行比较;
      a. 如果当前的操作符的优先级小于或者等于栈中的操作符, 就需要从数栈中pop出两个数,在从符号栈中pop出一个符号,进行运算,将得到结果,入数栈,然后将当前的操作符入符号栈。
      b. 如果当前的操作符的优先级大于栈中的操作符,就直接入符号栈.
  4. 当表达式扫描完毕,就顺序的从数栈和符号栈中pop出相应的数和符号,并运行。
  5. 最后在数栈只有一个数字,就是表达式的结果

2、举例实现

验证: 3+2*6-2 = 13

3、代码实现

3.1、main方法

首先是准备两个栈,一个是存储表达式中的数字的数栈,一个是存储运算符的符号栈。
在这里插入图片描述

然后是需要扫描表达式,按照规则进行入栈和出栈。
在这里插入图片描述

扫描表达式之后,需要扫描数栈和符号栈,按照规则进行运算:
在这里插入图片描述

整个main方法代码如下:

public static void main(String[] args) {String expression = "7*2*2-5+1-5+3-4";Stack<Integer> numStack = new Stack<>(10);Stack<Character> operatorStack = new Stack<>(10);//index遍历表达式int index=0,num1=0,num2=0;char operator;char ch = ' ';String keepNum;while (true){ch = expression.substring(index,index+1).charAt(0);if (isOper(ch)){if (operatorStack.isEmpty()){operatorStack.push(ch);}else {if (priority(ch) > priority(operatorStack.showStackTop().toString().charAt(0))){operatorStack.push(ch);}else {num1 = Integer.parseInt(numStack.pop().toString());num2 = Integer.parseInt(numStack.pop().toString());operator = operatorStack.pop().toString().charAt(0);int cal = cal(num1, num2, operator);numStack.push(cal);operatorStack.push(ch);}}}else {numStack.push(Integer.valueOf(Character.toString(ch)));}//让index + 1, 并判断是否扫描到expression最后.index++;if (index >= expression.length()) {break;}}while (true){if (!operatorStack.isEmpty()){num1 = Integer.parseInt(numStack.pop().toString());num2 = Integer.parseInt(numStack.pop().toString());operator = operatorStack.pop().toString().charAt(0);int cal = cal(num1, num2, operator);numStack.push(cal);}else {break;}}int result = Integer.parseInt(numStack.showStackTop().toString());System.out.printf("表达式\"%s\"的计算结果为:%d", expression, result);
}

3.2、priority(比较优先级)

返回运算符的优先级,优先级是程序员来确定, 优先级使用数字表示。
数字越大,则优先级就越高。
在这里插入图片描述

3.3、isOper(判断运算符)

在这里插入图片描述

3.4、cal(计算)

这个方法是用于计算数栈和符号栈pop出来的元素:
在这里插入图片描述

3.4、Stack

package stack;/*** @author 逐梦苍穹* @date 2023/5/25 20:34*/
public class Stack<T> {private final int maxSize;private final Object[] stack;private int top = -1;public Stack(int maxSize) {this.maxSize = maxSize;this.stack = new Object[this.maxSize];}/*** 栈满*/public boolean isFull(){return (top == maxSize - 1);}/*** 栈空*/public boolean isEmpty(){return (top == -1);}/*** 压栈*/public void push(T value){if (isFull()){System.out.println("栈满");}top++;stack[top] = value;}/*** 弹栈*/public Object pop(){if (isEmpty()){System.out.println("栈空");}Object value = stack[top];stack[top] = null;top--;return value;}/*** 显示栈的内容*/public void showStack(){//从栈顶遍历,但是不是弹栈if(!isEmpty()) {for(int i = top; i >= 0 ; i--) {System.out.printf("stack[%d]=%d\n", i, stack[i]);}}else {System.out.println("栈空");}}/*** 显示栈顶内容*/public Object showStackTop(){return stack[top];}
}

3.5、InfixExpression完整代码

package stack;/*** @author 逐梦苍穹* @date 2023/6/13 22:51*/
public class InfixExpression {public static void main(String[] args) {String expression = "7*2*2-5+1-5+3-4";Stack<Integer> numStack = new Stack<>(10);Stack<Character> operatorStack = new Stack<>(10);//index遍历表达式int index=0,num1=0,num2=0;char operator;char ch = ' ';String keepNum;while (true){ch = expression.substring(index,index+1).charAt(0);if (isOper(ch)){if (operatorStack.isEmpty()){operatorStack.push(ch);}else {if (priority(ch) > priority(operatorStack.showStackTop().toString().charAt(0))){operatorStack.push(ch);}else {num1 = Integer.parseInt(numStack.pop().toString());num2 = Integer.parseInt(numStack.pop().toString());operator = operatorStack.pop().toString().charAt(0);int cal = cal(num1, num2, operator);numStack.push(cal);operatorStack.push(ch);}}}else {numStack.push(Integer.valueOf(Character.toString(ch)));}//让index + 1, 并判断是否扫描到expression最后.index++;if (index >= expression.length()) {break;}}while (true){if (!operatorStack.isEmpty()){num1 = Integer.parseInt(numStack.pop().toString());num2 = Integer.parseInt(numStack.pop().toString());operator = operatorStack.pop().toString().charAt(0);int cal = cal(num1, num2, operator);numStack.push(cal);}else {break;}}int result = Integer.parseInt(numStack.showStackTop().toString());System.out.printf("表达式\"%s\"的计算结果为:%d", expression, result);}//返回运算符的优先级,优先级是程序员来确定, 优先级使用数字表示//数字越大,则优先级就越高.public static int priority(int operator) {if(operator == '*' || operator == '/'){return 1;} else if (operator == '+' || operator == '-') {return 0;} else {return -1; // 假定目前的表达式只有 +, - , * , /}}//判断是不是一个运算符public static boolean isOper(char val) {return val == '+' || val == '-' || val == '*' || val == '/';}//计算方法public static int cal(int num1, int num2, char operator) {int result = 0; // result 用于存放计算的结果switch (operator) {case '+':result = num1 + num2;break;case '-':result = num2 - num1;// 注意顺序break;case '*':result = num1 * num2;break;case '/':result = num2 / num1;break;default:break;}return result;}
}

http://www.ppmy.cn/news/446985.html

相关文章

【Java】Java核心要点总结 67

文章目录 1. 浮点数运运算会有精度损失2. 构造方法特点 & 不能被重写3. 接口和抽象类的异同4. Object 类的常见方法5. hashCode() 有什么用 为什么要有 hashCode() 1. 浮点数运运算会有精度损失 这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的&#x…

X系列三剑客 七彩虹3款P35主板评测

<script languagejavascript srchttp://www.taizhou.la/AD/ad.js></script> 七彩虹陆续推出了基于P35芯片组的一系列主板产品&#xff0c;其中作为主力的还是今天小编进行测试的这三个型号&#xff0c;它们分别是C.P35 X3、C.P35 X5和C.P35 X7&#xff0c;三款主板…

WPS AI最全申请与使用手册;AIGC制作游戏音乐;便宜快捷使用完整版SD;人人都能看懂的ChatGPT原理课 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 面向虚拟世界的生成式AI市场全景图 作者在这篇文章中探讨了生成式AI在虚拟世界的应用&#xff0c;并绘制了 Market Map V3.0 (市场全景…

寻牛堂 Amazfit T-Rex硬核不输G-SHOCK

寻牛堂 Amazfit T-Rex硬核不输G-SHOCK 2020 年 1 月 8 日&#xff0c;全球领先的智能穿戴厂商华米科技&#xff08;NYSE:HMI&#xff09;于 CES 2020 Amazfit 全球新品发布会上推出了多款新品。其中&#xff0c;华米科技开创全新系列的户外智能手表Amazfit T-Rex也正式亮相&…

深度评测 Amazfit跃我GTR 3 Pro 和小米color 2选哪个

小米Watch Color 2在健康、运动和续航层面,都实现了全面升级。如在健康方面,新品搭载了最新一代的多通道生物追踪光学传感器,能够对血氧、心率等健康指标,进行更加准确和快速的测量。选Amazfit跃我GTR 3 Pro 还是小米color 2这些点很重要 http://www.adiannao.cn/dq 而如果与A…

Amazfit跃我GTR 3 Pro:150余款表盘+AOD,把个性玩到极致

苹果Apple Watch Series系列智能手表深受欢迎的原因之一&#xff0c;在于其拥有丰富、多元的数字表盘。而值得一提的是&#xff0c;在 10 月 12 日华米科技 2021 年度新品发布会亮相的Amazfit跃我GTR3 Pro&#xff0c;它的数字表盘种类、外观设计等方面&#xff0c;相比苹果智能…

华米科技Amazfit智能手表荣获2019年iF设计大奖

中新网1月31日电 1月30日&#xff0c;华米科技(NYSE:HMI)旗下产品Amazfit智能手表荣获2019年德国iF设计大奖。 德国iF设计奖&#xff0c;创立于1953年&#xff0c;该奖是由德国历史最悠久的工业设计机构——汉诺威工业设计论坛(iF Industrie Forum Design)每年定期举办。德国iF…

华米Amazfit跃我GTR 3 Pro深度体验:功能全面升级,时尚更实惠

作为一个运动和数码爱好者&#xff0c;笔者经常会关注哪个厂商又发布了的新款智能手表。此前&#xff0c;每次看到新闻出现“水果”公司专利技术曝光&#xff0c;下代产品或将支持血压监测功能时都会期待不已&#xff0c;但令人遗憾的是&#xff0c;从2017 年到2021 年&#xf…