使用到了ArrayDeque集合:使用ArrayDeque表示Queue比LinkedList、表示Stack效率更高
ArrayDeque使用详解

package com.kiger.Demo;import java.util.ArrayDeque;
import java.util.Scanner;
import java.util.Stack;/*** @ClassName SuffixExpression* @Description TODO* @Author zk_kiger* @Date 2019/9/26 11:32* @Version 1.0*/public class SuffixExpressionUtil {private SuffixExpressionUtil() {}public static void main(String[] args) {Scanner input = new Scanner(System.in);char s[] = input.nextLine().toCharArray();ArrayDeque<String> suffix = SuffixExpressionUtil.TransformSuffix(s);Integer result = SuffixExpressionUtil.SuffixCalculate(suffix);System.out.println(result);}// 将中缀表达式转化为后缀表达式public static ArrayDeque<String> TransformSuffix(char[] s) {ArrayDeque<String> queue = new ArrayDeque<>();Stack<Character> stack = new Stack<>();for (int i = 0; i < s.length; ) {// ‘ ’用于分割大于9的整数if (s[i] == ' ') {i++;continue;}// 如果是运算数将运算数全部入队(后缀表达式的队列)else if (s[i] >= '0' && s[i] <= '9') {int sum = 0;while(i < s.length && s[i] >= '0' && s[i] <= '9') {sum = sum*10 + s[i]-'0';i++;}queue.add(Integer.toString(sum));}// 如果遇到右括号,则将运算栈运算符全部入队,直到遇到左括号else if (s[i] == ')') {while(!stack.isEmpty() && stack.peek() != '(') {queue.add(stack.pop() + "");}// 左括号出栈stack.pop();i++;}// 如果是操作符,根据符号优先级// 若下一个符号优先级大于栈顶符号,入栈// 若下一个符号优先级小于栈顶符号,栈顶入队,一直循环比较else {while(!stack.isEmpty() && compare(stack.peek(), s[i]) < 0) {queue.add(stack.pop() + "");}stack.add(s[i]);i++;}}// 如果栈中还有操作符,那么全部入队while (!stack.isEmpty()) {queue.add(stack.pop() + "");}return queue;}// 后缀表达式进行计算public static int SuffixCalculate(ArrayDeque<String> queue) {// 使用一个辅助栈来存储数字Stack<Integer> res = new Stack<>();while (!queue.isEmpty()){String s = queue.pop();// 如果队列为操作符,那么从运算栈中取2个运算符进行计算,并将计算结果重新入栈if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {int a = res.pop();int b = res.pop();int result = cal(b, a, s);res.push(result);} else {res.add(Integer.parseInt(s));}}return res.pop();}private static int compare(char peek, char c) {if (peek == '(' || c == '(') return 1;if (c == '+' || c == '-') return -1;if (c == '*' && (peek == '*' || peek == '/')) return -1;if (c == '/' && (peek == '*' || peek == '/')) return -1;return 1;}private static int cal(int a, int b, String s) {//计算if (s.equals("+")) {return a + b;} else if (s.equals("-")) {return a - b;} else if (s.equals("*")) {return a * b;} else {return a / b;}}}

栈与队列及其应用 - 1.算术表达式求值相关推荐

  1. 【Leetcode栈与队列】150. 逆波兰表达式求值(后缀表达式求值,看作对对碰游戏)

    文章目录 Leetcode150 1.问题描述 2.解决方案 3.计算机的思考方式 Leetcode150 1.问题描述 2.解决方案 1.逆波兰表达式优点 2.逆波兰表达式相当于是二叉树中的后序遍历 ...

  2. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  3. 【数据结构】栈的应用-算术表达式求值#数据结构实验任务书

    实验题目:栈的应用-算术表达式求值 正文 实验环境: Visual C++ 2010 实验目的: 1.掌握栈的定义及实现: 2.掌握利用栈求解算术表达式的方法. 实验内容: 通过修改完善教材中的算法3 ...

  4. 北京林业大学数据结构实验二 基于栈的算术表达式求值算法

    第1关:基于栈的中缀算术表达式求值 参见课本P75 例3.3 #include <iostream> #include<iomanip>#define MAXSIZE 100 ...

  5. 【Java】基于栈的算术表达式求值

    定义异常类 public class ExpressionException extends RuntimeException {private static final long serialVer ...

  6. 《Algorithms》—— Dijkstra 的双栈算术表达式求值算法

    想当年学数据结构的时候,一直觉得这个是我一辈子都搞不懂的一个东西.现在看看...还挺简单的... 重点在于如何解析由括号.运算符和数字组成的字符串,并按照正确的顺序完成各种初级算术操作.利用了两个栈( ...

  7. 算术表达式求值(C语言栈)

    题目:算术表达式求值 题目描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子.设计一个程序,演示用运算符优先法对算数表达式求值的过程. 基本要求:以字符序列的形式从终端输入语 ...

  8. 栈实现算术表达式求值

    算术表达式求值 利用栈求解的一个典型的问题是算术表达式求值,例如:"3+4*2-(1+1)#",这样的表达式计算,在计算过程中,不是读到一个运算就立即计算,而是要与后面的运算符进行 ...

  9. 编程题实训-实验2-基于栈的算术表达式求值算法(北京林业大学)

    第1关:基于栈的中缀算术表达式求值 任务描述 本关任务:输入一个中缀算术表达式,求解表达式的值.运算符包括+.-.*./.(.).=,参加运算的数为double类型且为正数.(要求:直接针对中缀算术表 ...

最新文章

  1. 《Linux From Scratch》第二部分:准备构建 第三章:软件包与补丁- 3.1. 简介
  2. linux中快速查找文件
  3. 5.jsp中动态include与静态include的区别
  4. 数据包过滤 系统 linux,Ubuntu16.04安装libpcap开发库对pcap文件中的数据包进行过滤...
  5. 市面主要远场语音交互技术架构
  6. Python——通过斐波那契数列来理解生成器
  7. 记一次曲折的jsp手工半盲注入
  8. 戚俊:可能是最懂架构的投资人
  9. python 模块 包 库_模块(包、库)
  10. 抄底指标:秘密买卖点
  11. java post上传进度,OkHttp实现文件上传进度
  12. Java selenium 设置代理
  13. unity 移动物体到指定位置的四种方法
  14. 华为OD(外包)社招技术二面,总结复盘
  15. 自用live2d制作
  16. 计算机系统盘没用的东西怎么删除,怎样清理电脑c盘无用的东西
  17. python 利用opencv实现颜色检测
  18. openfoam一些报错的原因(持续更新)
  19. RN-路由---基础
  20. Cesium — orientation计算

热门文章

  1. 如何下载腾讯在线文档?如何将腾讯在线文档导出为本地Word文档(.docx)
  2. Ubuntu 安装 亿图
  3. python进阶练习之——打印星号❤️
  4. python优化else_python 中 难以理解的for-else语句
  5. python(6):条件语句和循环语句 + 三元表达式
  6. matlab 毕业论文题目,与matlab相关主题论文_基于matlab的论文题目_论文翻译器
  7. java项目管理系统_基于SSM框架的JAVA科研项目管理系统
  8. DDR 速率MT/s(GT/s) 与 MHz的关系
  9. 如何在线上给证件打上水印
  10. k8s、控制器模式解析、定义多少个副本、卷挂载、滚动更新、版本回滚