栈实现综合计算器(中缀表达式)

  • 使用栈来实现综合计算器-自定义优先级[priority]

思路分析

代码实现

注意点:

  1. char类型可以和int类型比较,char本质上也是int
  2. 查找字符串第 i 个字符可以用str.charAt(num)
  3. 截取字符串第 i 到 j 位str.substring(i,j)
  4. 字符串型数字转整形Integer.parseInt(str)
package stack;import java.util.Scanner;public class Calculator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String expression = scanner.nextLine();// 创建两个栈:数栈和符号栈CalculatorStack numStack = new CalculatorStack(10);CalculatorStack opeStack = new CalculatorStack(10);// 需要的相关变量int index = 0;  // 用于扫描int num1 = 0;int num2 = 0;int ope = 0;int res = 0;char ch = ' ';  // 将每次扫描的结果char存放到chString keepNum = ""; // 用于拼接多位数// 开始while循环扫描expressionwhile (true) {// 先依次得到expression中的每一个字符ch = expression.substring(index, index + 1).charAt(0);// 判断ch类型,做相应处理if (opeStack.isOpe(ch)) { // 如果是运算法// 判断符号栈是否为空if (opeStack.isEmpty()) {// 如果为空,直接入符号栈opeStack.push(ch);} else {  // 操作栈不为空// 如果当前的操作符的优先级小于或等于栈中的操作符// 需要从符号栈中pop一个符号,数栈中pop两个数字,进行运算// 得到结果后,入数栈,然后将当前符号入符号栈if (opeStack.priority(ch) <= opeStack.priority(opeStack.peek())) {num1 = numStack.pop();num2 = numStack.pop();ope = opeStack.pop();res = numStack.cal(num1, num2, ope);numStack.push(res); // 运算结果入数栈opeStack.push(ch);  // 当前操作符入符号栈} else {// 如果当前的操作符的优先级大于栈中的操作数// 直接入符号栈opeStack.push(ch);}}} else {// 如果是数字,直接入数栈// 减48的原因是在ASIIC表中数字真实值与数字相差48// numStack.push(ch - 48);// 优化:处理多位数// 1. 当处理多位数时候,不能发现是一个数就立即入栈,因为可能是多位数// 2. 在处理树时候,需要向expression的表达式的index后再看以为,如果是数就入栈,如果发现是符号就继续扫描// 3. 因此需要定义一个字符串变量,用于拼接.keepNum += ch;// 如果ch已经是expression的最后一位,直接入栈if (index == expression.length() - 1) {numStack.push(Integer.parseInt(keepNum));} else {// 判断下一个字符是不是数字,如果是数字就继续扫描,如果是运算符则入栈if (opeStack.isOpe(expression.substring(index + 1, index + 2).charAt(0))) {// 如果后一位是运算符numStack.push(Integer.parseInt(keepNum));// 重要操作:keepNum清空keepNum = "";}}}// index+1 并判断是否扫描到expression的最后index++;if (index >= expression.length()) {break;}}// 表达式扫描完毕后,顺序从数栈和符号栈中pop出相应的符号,并运算即可while (true) {// 如果符号栈为空,则计算到最后的结果// 此时数栈中只有一个数字【结果】if (opeStack.isEmpty()) {break;}num1 = numStack.pop();num2 = numStack.pop();ope = opeStack.pop();res = numStack.cal(num1, num2, ope);numStack.push(res);}System.out.printf("表达式%s = %d", expression, res);}
}// 先创建一个栈
class CalculatorStack {private int maxSize;    // 栈的大小private int[] stack;    // 数组模拟栈,数据放在该数组private int top = -1;   // top表示栈顶,初始化为-1public CalculatorStack(int maxSize) {this.maxSize = maxSize;stack = new int[maxSize];}// 返回当前栈顶的值,仅查询public int peek() {return stack[top];}public boolean isFull() {return top == maxSize - 1;}public boolean isEmpty() {return top == -1;}public void push(int value) {if (isFull()) {System.out.println("栈满");return;}stack[++top] = value;}public int pop() {if (isEmpty()) {throw new RuntimeException("栈空,没有数据");}return stack[top--];}public void list() {if (isEmpty()) {System.out.println("栈空,没有数据");return;}for (int i = top; i >= 0; i--) {System.out.printf("%d ", stack[i]);}}// 返回运算符的优先级,优先级是程序员确定,优先级使用数字表示// 数字越大,优先级越高public int priority(int ope) {if (ope == '*' || ope == '/') {return 1;} else if (ope == '+' || ope == '-') {return 0;} else {return -1;  //假设目前表达式只有+、-、*、/}}// 判断是不是一个运算符public boolean isOpe(char val) {return val == '+' || val == '-' || val == '*' || val == '/';}// 计算方法public int cal(int num1, int num2, int ope) {int res = 0;switch (ope) {case '+':res = num1 + num2;break;case '-':res = num2 - num1;break;case '*':res = num1 * num2;break;case '/':res = num2 / num1;break;default:break;}return res;}}

Java编程:栈的应用实例——简单的综合计算器实现(中缀表达式)相关推荐

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

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

  2. 【Java编程】遗传算法简介与简单二进制编码计算

    什么是遗传算法 如果你去百度百科搜的话,他会给你讲一堆遗传算法的概念,其实说白了,遗传算法就是计算机科学家从自然界获得灵感总结的一套优化方法的总称. 遗传算法是用来解决优化问题的.很早之前,我看到过一 ...

  3. java编程基础 应用与实例 徐明浩_Java编程基础、应用与实例

    第1章  什么是Java程序设计语言 1.1  Java语言诞生背景 1.2  Java语言的特点 1.3  安装Java程序开发工具(JDK1.5) 1.4  Java程序开发过程 1.5  运行第 ...

  4. 【数据结构与算法 6】栈实现综合计算器

    一.栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放 ...

  5. java一维打地鼠_Java编程实现打地鼠文字游戏实例代码

    控制台输入数字,与随机数匹配,匹配正确则返回"打中了!" 匹配错误则返回"太遗憾!没打中!" package hitmouse; import java.uti ...

  6. java打地鼠文本代码_Java编程实现打地鼠文字游戏实例代码

    Java编程实现打地鼠文字游戏实例代码 发布时间:2020-10-05 07:00:48 来源:脚本之家 阅读:91 作者:lao_huang123 控制台输入数字,与随机数匹配,匹配正确则返回&qu ...

  7. java 以一个最高有效位为1的二进制数字开始_第02章 Java编程基础

    ·本章学习目标 熟悉Java编程的基础知识 掌握Java语言的基本数据类型.操作符.表达式 掌握Java程序的流程控制语句 熟悉并学会初步使用Java编程环境 ·本章学习内容 数据类型 常量.变量与表 ...

  8. java用栈处理四则运算_Java 用栈处理四则运算

    import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Stack; imp ...

  9. 翻译:通过Java编程创建X.509格式的数字签名证书

    本文翻译自此篇文章,如有余力可直接阅读原文. 我所需要解决的问题很简单:创建一个只需要配置很少字段的X.509协议的证书,再使用已有的CA私钥/证书进行签名,最后导出为PKCS12格式的签名证书.把这 ...

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

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

最新文章

  1. 序列化和反序列化的几种方式(DataContractSerializer)(二)
  2. 排好序的数组中,找出两数之和为m的所有组合
  3. 怎么用python编简单游戏_用Python实现一个简单的算术游戏详解
  4. oracle sql练习_数据分析之学习SQL
  5. 开源任务调度平台elastic-job-lite源码解析
  6. VS2008 Web Application和Web Site的区别_转载
  7. Netty系列之一开始使用
  8. 订单编号,递增且不连续(php版)
  9. Oracle中drop_column的几种方式和风险
  10. 【ES】ES 好文档积累
  11. HDU 2665 Kth number(主席树静态区间第K大)题解
  12. Eclipse—在Eclipse中如何发布创建的JavaWeb工程
  13. 【180929】仿微信飞机大战游戏源码
  14. 群晖-VideoStation-(TMDB刮削器)api申请
  15. Java线程死锁模拟
  16. KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结【转】
  17. 笔记本电脑外接显示器 卡_如何向Mac笔记本电脑添加和配置外接显示器
  18. Redis最详细讲解
  19. 请19级的童鞋们接收一下
  20. 高盛:Juniper市场表现将超过Cisco、Arista

热门文章

  1. 145. PHP header status code
  2. 36.session
  3. 5.一个三维数组,如何根据最后一维的数字大小正序排列,当然同时要保证索引的关联
  4. 15. 发货选项(Shipping Options)
  5. 36. Element length 属性
  6. CSS3:伪类前的冒号和两个冒号区别
  7. python 列表转字典的一些方法
  8. MVC学习笔记:MVC实现用户登录验证ActionFilterAttribute用法并实现统一授权
  9. 方法:如何解决NetShareEnum返回ERROR_NO_UNICODE_TRANSLATION(1113)的问题
  10. SharePoint2010企业开发最佳实践(八)---- SPWeb 对象