数据结构:栈实现简易计算器
文章目录
- 栈实现简易计算器
- 思路
- 代码实现
- 栈结构
- 运算方法
- 测试
栈实现简易计算器
之前的博客已经介绍了栈数据结构,栈有着数据先进后出的特点,因此用于实现简易计算器时相当方便。本博文中将介绍如何用栈实现一个可以进行简单四则运算不含括号的简易计算器(中缀表达式)
思路
- 首先创建两个栈,一个用于存储数而另一个用于存储运算符号。
- 首先需要一个index索引来遍历表达式
- 遍历到数字时直接入数栈
- 遍历到运算符时需要分情况讨论
- 如果当前符号栈为空直接入栈
- 如果当前符号栈不为空需要分情况讨论
- 当前遍历到的运算符的运算优先级小于或者等于栈中的运算符优先级,先从数栈中取出两个数和从字符栈中取出一个运算符,将其进行运算之后将得到的新的数存入数栈,最后将当前遍历到的运算符存入字符栈
- 当前遍历到的运算符的运算优先级大于栈中的运算符优先级则直接存入字符栈
- 当表达式遍历完之后,从数栈和符号栈依次取出相应的数和符号并计算
- 当数栈只剩下一个数字时,计算完毕,此时该数为最终结果。
代码实现
栈结构
用之前的方法用数组模拟栈
class CalculatorStack
{private int maxSize;private int[] stack;private int top = -1;public CalculatorStack(int maxSize) {this.maxSize = maxSize;stack = new int[maxSize];}/**** @return 返回栈顶的数据<不弹出数据>*/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()){throw new RuntimeException("栈满无法添加数据....");}top++;stack[top] = value;}public int pop(){if (isEmpty()){throw new RuntimeException("栈空无法返回数据....");}return stack[top--];}}
运算方法
/*** 返回运算符的优先级* @param operation* @return 返回数字代表优先级 数字越大优先级越高*/
public int getPriority(int operation)
{if (operation == '*' || operation == '/'){return 1;}else if (operation == '+' || operation == '-'){return 0;}else{throw new RuntimeException("输入操作符有误!");}
}/*** 判断是否是运算符* @param val* @return*/
public boolean isOperation(int val)
{return val == '+' || val == '-' || val == '*' || val == '/';
}private int calculate(int num1,int num2,int operation)
{int result = 0;switch (operation){case '+':result = num2 + num1;break;case '-'://注意顺序result = num2 - num1;break;case '*':result = num2 * num1;break;case '/'://注意顺序result = num2 / num1;break;}return result;
}
核心方法
public static void calculate(String expression)
{//创建两个栈 一个数栈 一个符号栈CalculatorStack numStack = new CalculatorStack(2002);CalculatorStack operationStack = new CalculatorStack(519);//定义相关变量int index = 0;int num1,num2,result;int operation;//用于拼接多位数String keepNum = "";while (true){//依次得到expression中的每一个字符char ch = expression.substring(index, index + 1).charAt(0);//如果是运算符if (operationStack.isOperation(ch)){//判断符号栈是否为空if (!operationStack.isEmpty()){//如果当前操作符优先级大于栈中的所有操作符,直接入栈if (operationStack.getPriority(ch) > operationStack.getPriority(operationStack.peek())){operationStack.push(ch);}//如果当前操作符的优先级小于或等于栈中的操作符,先弹出符号栈栈顶的操作符和数栈的头两个数据else{num1 = numStack.pop();num2 = numStack.pop();operation = operationStack.pop();result = numStack.calculate(num1,num2,operation);//运算结果入数栈numStack.push(result);//符号ch入符号栈operationStack.push(ch);}}else{//符号栈为空直接入栈operationStack.push(ch);}}//如果是数直接入数栈else{//1.当处理多位数时,不可以直接入栈,可能是多位数//2.处理多位数时需要看expression表达式index位置的后一位是什么,如果是数字需要继续读取否则直接入栈//3.因此需要定义一个变量字符串用于拼接数字keepNum+=ch;//如果当前处于表达式的末尾if (index == expression.length() - 1){numStack.push(Integer.parseInt(keepNum));keepNum = "";}else{//判断下一位是否是字符if (operationStack.isOperation(expression.substring(index+1,index+2).charAt(0))){numStack.push(Integer.parseInt(keepNum));//重置keepNum!!!!!keepNum = "";}//1 != '1' ---> 1 = '1' - 48;//numStack.push(ch - 48);}}//让index+1,并且判断是否扫描到expression最后index++;if (index >= expression.length()){break;}}//当表达式扫描完毕就顺序地从数栈和符号栈中取出相应的数和符号while (true){//如果符号栈为空--->计算完毕if (operationStack.isEmpty()){break;}num1 = numStack.pop();num2 = numStack.pop();operation = operationStack.pop();result = numStack.calculate(num1,num2,operation);numStack.push(result);}result = numStack.pop();System.out.printf("表达式:%s=%d",expression,result);
}
测试
public class Calculator
{public static void main(String[] args){String expression = "100+20*2-4";CalculatorStack.calculate(expression);}
}//-----------------------------------------------------测试结果----------------------------------------------------
表达式:100+20*2-4=136
以上。
如有不足或错误欢迎评论指正
数据结构:栈实现简易计算器相关推荐
- (C语言)栈应用简易计算器实现
//利用栈实现简易计算器,进行包含+,-,*,/,(,)间的计算 #include<stdio.h> #include<string.h> #define MaxSize 10 ...
- evaluate函数使用无效_[Python实战]使用栈实现简易计算器
我们这次实现的命令行计算器,支持加减乘除.括号.浮点数.负数,以及查看历史和退出功能. 主要的思路:read - parse - print - loop. read 阶段是指读取用户在提示符(cal ...
- 数据结构课设-简易计算器
项目3:算术表达式计算器 目标:实现简单的计算:+.-.*./.(.) 实现思路: [按照先乘除后加减,先左后右,先括号里后括号外的顺序,得到操作符优先关系表(7*7的二维数组] 1,创建两个栈:存放 ...
- java栈实现简易计算器算法
问题描述: 对于任意字符串,包含+ - * /和括号, 求出该表达式的值 首先百度该问题,网上有不少答案,但是实际思考,发现,很多答案没有考虑完全,例如: -1+(-2)*3 遇到负号怎么 ...
- c语言特殊计算器设计报告,C语言数据结构栈计算器的实现课题设计报告书
C语言数据结构栈计算器的实现课题设计报告书 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 目录1. 课程设计任务 12. 需求分析 ...
- 栈趣用---中缀表达式实现简易计算器
中缀表达式:我们日常生活中用的表达式就是中缀表达式,比如4+5*6-7,它的特点就是人容易理解和计算,但是计算机不买账,对于中缀表达式,计算机实现起来复杂度很高,这里模拟了计算机计算中缀表达式过程,实 ...
- 【Java数据结构与算法】第四章 栈实现综合计算器
第四章 栈实现综合计算器 文章目录 第四章 栈实现综合计算器 一.栈 1.介绍 2.应用场景 3.思路 4.代码实现 二.综合计算器 v1.0 1.思路 2.代码实现 三.前缀.中缀和后缀表达式规则 ...
- 【数据结构与算法 6】栈实现综合计算器
一.栈 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放 ...
- 如何利用计算机求函数解析式,数据结构表达式求值(计算器)实验报告(共10篇).doc...
数据结构表达式求值(计算器)实验报告(共10篇) 数据结构表达式求值(计算器)实验报告(共10篇) 数据结构课程设计_实验报告(一)表达式求值(计算器) 数据结构课程设计 实验报告 起止时间:2015 ...
最新文章
- Apache——启动错误:[Cannot load modules/mod_actions.so into server]解决方案
- 角谷定理python输出变化过程_日本一位中学生发现一个奇妙的“定理”,请角谷教授证明,而教授无能为力,于是产生角谷猜想。猜想的内容...
- qt mysql 清空表格_qt删除数据库中的表
- 看代码学知识之(2) ListView无数据时显示其他View
- php object keys_原生js中Object.keys方法详解
- 数据流中的中位数java_数据流中的中位数
- crontab自动执行任务,失败原因记录
- python怎么写运维脚本_python运维脚本实例
- 推荐一款wordpress个人博客主题,中文版主题
- 开源电脑屏幕录制软件Captura源码下载及编译(Win10,VS2022)
- WebSocket之GoEasy框架
- mysql2008安装失败_SQL Server 2008 安装失败问题总结
- calib matlab,使用Matlab Toolbox_calib进行摄像机标定
- 怎么样关闭计算机管理员,电脑怎么样使用命令行程序启用和关闭管理员账户 - 今日爆点...
- 好文:中国Saas蜕变史
- 数值分析基础工具使用Matlab绘制双曲线
- 真刑!又一个程序员同行要进去了
- c8815 android os,华为c8815刷机包 乐蛙OS5 完美版 0823期
- 小白快速变大神,零基础菜鸟应该怎么学编程
- Fabric背书过程中链码是并行还是串行?