栈实现简单四则运算

思路

  1. 需要两个栈,一个用来存数字,一个用来存符号

  2. 定义一个指针index用来遍历表达式

  3. 遍历表达式,index指向数字时,将该数字压入数字栈

    这里需要注意:指向的数字并非是一位数,可能是多位数

    是多位数的情况下,则需要在指向的数字往后看一位,如果是数字,要进行拼接,得到两位数;

    还需要再往后看一位,直到后一位是符号为止,才能将最终拼接出来的数压入数字栈

  4. index指向符号时,则需要判断

​ ①如果当前的符号栈为空,则直接压入符号栈

​ ②如果指向的符号优先级大于符号栈顶符号的优先级,则直接压入符号栈

​ ③如果指向的符号优先级小于或等于符号栈顶符号的优先级,则需要从数字栈中取出两个数,并在符号栈中取出一个符号,进行运算,将得到的结果压入数字栈,最后将指向的当前的符号压入符号栈

  1. 当表达式遍历结束,顺序从数字栈和符号栈中取出相应的数字和符号,并运算
  2. 最后在数字栈中只有一个数字,即表达式的最终结果

代码

public class Calculator {public static void main(String[] args) {String expression = "7*2*2-5+1-5+3-4"; //创建两个栈,数栈,一个符号栈ArrayStack2 numStack = new ArrayStack2(10);ArrayStack2 operStack = new ArrayStack2(10);//定义需要的相关变量int index = 0;//用于扫描int num1 = 0; int num2 = 0;int oper = 0;int res = 0;char ch = ' '; //将每次扫描得到char保存到chString keepNum = ""; //用于拼接 多位数//开始while循环的扫描expressionwhile(true) {//依次得到expression 的每一个字符ch = expression.substring(index, index+1).charAt(0);//判断ch是什么,然后做相应的处理if(operStack.isOper(ch)) {//如果是运算符//判断当前的符号栈是否为空if(!operStack.isEmpty()) {//如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数,//在从符号栈中pop出一个符号,进行运算,将得到结果,入数栈,然后将当前的操作符入符号栈if(operStack.priority(ch) <= operStack.priority(operStack.peek())) {num1 = numStack.pop();num2 = numStack.pop();oper = operStack.pop();res = numStack.cal(num1, num2, oper);//把运算的结果如数栈numStack.push(res);//然后将当前的操作符入符号栈operStack.push(ch);} else {//如果当前的操作符的优先级大于栈中的操作符, 就直接入符号栈.operStack.push(ch);}}else {//如果为空直接入符号栈..operStack.push(ch); // 1 + 3}} else { //如果是数,则直接入数栈//分析思路//1. 当处理多位数时,不能发现是一个数就立即入栈,因为他可能是多位数//2. 在处理数,需要向expression的表达式的index 后再看一位,如果是数就进行扫描,如果是符号才入栈//3. 因此我们需要定义一个变量 字符串,用于拼接//处理多位数keepNum += ch;//如果ch已经是expression的最后一位,就直接入栈if (index == expression.length() - 1) {numStack.push(Integer.parseInt(keepNum));}else{//判断下一个字符是不是数字,如果是数字,就继续扫描,如果是运算符,则入栈//注意是看后一位,不是index++if (operStack.isOper(expression.substring(index+1,index+2).charAt(0))) {//如果后一位是运算符,则入栈 keepNum = "1" 或者 "123"numStack.push(Integer.parseInt(keepNum));//重要的!!!!!!, keepNum清空keepNum = "";}}}//让index + 1, 并判断是否扫描到expression最后.index++;if (index >= expression.length()) {break;}}//当表达式扫描完毕,就顺序的从 数栈和符号栈中pop出相应的数和符号,并运行.while(true) {//如果符号栈为空,则计算到最后的结果, 数栈中只有一个数字【结果】if(operStack.isEmpty()) {break;}num1 = numStack.pop();num2 = numStack.pop();oper = operStack.pop();res = numStack.cal(num1, num2, oper);numStack.push(res);//入栈}//将数栈的最后数,pop出,就是结果int res2 = numStack.pop();System.out.printf("表达式 %s = %d", expression, res2);}}//先创建一个栈,直接使用前面创建好
//定义一个 ArrayStack2 表示栈, 需要扩展功能
class ArrayStack2 {private int maxSize; // 栈的大小private int[] stack; // 数组,数组模拟栈,数据就放在该数组private int top = -1;// top表示栈顶,初始化为-1//构造器public ArrayStack2(int maxSize) {this.maxSize = maxSize;stack = new int[this.maxSize];}//增加一个方法,可以返回当前栈顶的值, 但是不是真正的poppublic int peek() {return stack[top];}//栈满public boolean isFull() {return top == maxSize - 1;}//栈空public boolean isEmpty() {return top == -1;}//入栈-pushpublic void push(int value) {//先判断栈是否满if(isFull()) {System.out.println("栈满");return;}top++;stack[top] = value;}//出栈-pop, 将栈顶的数据返回public int pop() {//先判断栈是否空if(isEmpty()) {//抛出异常throw new RuntimeException("栈空,没有数据~");}int value = stack[top];top--;return value;}//显示栈的情况[遍历栈], 遍历时,需要从栈顶开始显示数据public void list() {if(isEmpty()) {System.out.println("栈空,没有数据~~");return;}//需要从栈顶开始显示数据for(int i = top; i >= 0 ; i--) {System.out.printf("stack[%d]=%d\n", i, stack[i]);}}//返回运算符的优先级,优先级是程序员来确定, 优先级使用数字表示//数字越大,则优先级就越高.public int priority(int oper) {if(oper == '*' || oper == '/'){return 1;} else if (oper == '+' || oper == '-') {return 0;} else {return -1; // 假定目前的表达式只有 +, - , * , /}}//判断是不是一个运算符public boolean isOper(char val) {return val == '+' || val == '-' || val == '*' || val == '/';}//计算方法public int cal(int num1, int num2, int oper) {int res = 0; // res 用于存放计算的结果switch (oper) {case '+':res = num1 + num2;break;case '-':res = num2 - num1;// 注意顺序break;case '*':res = num1 * num2;break;case '/':res = num2 / num1;break;default:break;}return res;}}

利用数组栈实现简单的四则运算相关推荐

  1. python 栈实现 加减乘除_数据结构与算法(六):基于栈实现简单的四则运算

    栈,是一种操作受限的线性表,其操作规则为:后进者先出,先进者后出. 目录 题目需求: 给定一个字符串,形如"1+6*5/3-8",根据其内容,计算结果,此例结果为3. 解题思路: ...

  2. 利用数组来实现简单三子棋游戏

    实现一个三字棋游戏,通过数组提供位置,由人和电脑轮流进行下棋,由于个人水平,仅能实现电脑随机下棋,并进行判断输赢,可进行循环游戏. 首先创建文本 yuanma.c//游戏实现 game.c//代码编译 ...

  3. 基于java的数据结构学习——数组实现的栈以及简单应用C++实现

    基于java的数据结构学习--数组实现的栈以及简单应用的 C++ 实现 源码: // // Created by PC-Saw on 2019/1/3. //#ifndef DATA_STRUCTUR ...

  4. php实现一个简单的四则运算计算器

    php实现一个简单的四则运算计算器(还不支持括号的优先级).利用栈这种数据结构来计算表达式很赞. 这里可以使用栈的结构,由于php的数组"天然"就有栈的特性,这里直接就利用了数组. ...

  5. java 简单数组_Java 数组分析及简单实例

    Java 数组 一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的! 但是这只是数组的最表面的东西! ...

  6. python实现简单的四则运算_Python实现简单的四则运算计算器

    一.算法 1.算法的主要思想就是将一个中缀表达式(Infix expression)转换成便于处理的后缀表达式(Postfix expression),然后借助于栈这个简单的数据结构,计算出表达式的结 ...

  7. python 数组升序_python简单数据清洗和分析

    利用python学习了简单一维数组和二维数组,明白了集合.数组.字典大概的关联,并学会从中点用不同的数组类型进行更好的分析. 读取excel文件,开始进行最简单的数据清洗. 将购药时间重新命名为销售时 ...

  8. 打印Java数组的最简单方法是什么?

    在Java中,数组不会覆盖toString() ,因此,如果尝试直接打印一个,则将得到className +'@'+数组的hashCode的十六进制,如Object.toString()所定义: in ...

  9. 【编程题】简单的四则运算

    问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 1.表达式只含 +, -, *, /, (, ), 四则运算符 2.表达式数值只包含个位整数(0-9),且不会出现 ...

最新文章

  1. glog 报错解决: /bin/bash: aclocal-1.14: command not found
  2. Asp.Net Core异常处理整理
  3. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板部分特例化
  4. Java 利用反射实现C#的委托
  5. nyoj-496-巡回赛--拓扑排序
  6. Linux(CenterOS 6.4)下安装jdk1.6
  7. string中c_str()、data()、copy(p,n)函数的用法
  8. Yii框架里用grid.CGridView调用pager扩展不显示最后一页按钮的解决
  9. 虚拟机管理需要哪些功能,以及虚拟机管理常见问题和解决方案
  10. nagios 飞信通知
  11. pyltp安装教程——保姆级
  12. python训练模型一直循环怎么办_用pycharm编写程序进行模型训练时总是有memory error错误,如何解决?...
  13. 牛客练习赛53 老瞎眼 pk 小鲜肉[思维+离线+线段树]
  14. 学术论文写作 | (7)NLP学术论文写作方法和技巧
  15. 数理统计基础-相关系数
  16. “麒麟计划”落地苍南,赋能外贸企业数字化转型!
  17. 财务系统建设者须知——财务知识碎片(一) 什么是会计科目、什么是会计账户?
  18. 拼多多2020届数据分析面试题合集
  19. 微信公众号开发--自定义菜单跳转页面并获取用户信息(续)
  20. 2021网刃杯CTF ez-sql

热门文章

  1. android:mimetype 自定义,Android: Intent匹配及mimeType匹配,这一篇就够了!!
  2. python天气预报制作过程_天气变冷了,用Python给父母制作一个天气提醒小助手~...
  3. 点击图片按钮 出来图片预览不兼容360极速模式 其他兼容
  4. laydate在火狐,360极速模式下,多个时间插件,只有一个可以用问题
  5. 亚马逊和Epic将入驻,微软应用商城向第三方开放
  6. html div边框阴影
  7. 【多式联运】基于matlab遗传算法求解多式联运冷链运输成本优化问题【含Matlab源码 2207期】
  8. 怎么彻底删除MySQL服务
  9. 补码运算Overflow判断
  10. 程序员上班时戴耳机都在听什么?