数据结构之中缀表达式实现计算器

栈还是用的上一篇的数组模拟栈,并在此之上增加了

判断是否是一个运算符的方法

获取运算符的优先级方法

计算结果方法

查看栈顶元素的方法

四个方法,具体代码如下:

package com.ebiz.stack;/*** @author YHj* @create 2019-07-20 14:20* 数组模拟栈*/public class ArrayStack {private  int maxSize;private  int [] arr;  //数组模拟栈   private  int top = -1;//构造方法,初始化数组public ArrayStack(int maxSize) {this.maxSize=maxSize;this.arr = new int[maxSize];}//验证栈满public boolean isFull(){return top == maxSize-1;}//验证为空public boolean isEmpty(){return top == -1;}//入栈public void push(int value){if (isFull()){System.out.println("栈已满");return;}top++;arr[top]=value;}//出栈public int pop(){if(isEmpty()){throw new RuntimeException("栈已空");}int value=arr[top];top--;return value;}//遍历栈public void list(){if (isEmpty()){throw new RuntimeException("栈为空");}while (true){if (isEmpty()){System.out.println("栈为空");break;}System.out.printf("出站元素为%d%n",arr[top]);top--;}}//返回运算符的优先级  优先级用数字表示//数字越大,代表优先级越高// *或者/  优先级为1// +或者-  优先级为0// -1 代表运算符为问题运算符public int priority(int operator){if ('*' == operator || '/' == operator){return 1;}else if ('+' == operator || '-' == operator){return 0;}else{return -1;}}//判断是否为一个运算符public boolean isOperator(char operator){return operator == '+' || operator == '-' || operator == '*' || operator == '/';}//计算方法public int calculator(int num01,int num02,int operator){//用于存放计算结果int result=0;switch (operator){case '+':result = num01+num02;break;case '-':result = num02-num01;break;case '*':result = num01*num02;break;case  '/':result = num02/num01;break;default:break;}return result;}//获取符号栈的栈顶符号,并不是真正取出该元素public int peek() {return arr[top];}
}

下面给出测试,中缀表达式提前给定好,只涉及到了两位数,对于小括号还有小数点后面会将中缀转为后缀,便于计算

package com.ebiz.stack;/*** @author YHj* @create 2019-07-22 11:04* 栈模拟计算器  中缀表达式*/
public class Calculator {public static void main(String[] args) {//表达式//String expression = "50+2*6-2";String expression = "5-2*3+1";//创建数字栈ArrayStack numeStack = new ArrayStack(10);//创建运算符栈ArrayStack operatorStack = new ArrayStack(10);//初始化索引,用于扫描表达式int index = 0;int num01 = 0;int num02 = 0;int operator = ' '; //定义运算符int res =0;      //存放结果char ch =' ';  //将每次扫描得到的char保存到ch// 定义字符串,拼接多位数String str="";while (true){//开始扫描表达式,并判断是数字还是符号ch=expression.substring(index,index+1).charAt(0);//如果为运算符if (operatorStack.isOperator(ch)){//判断符号栈是否为空  符号栈不为空if (!operatorStack.isEmpty()){//判断符号优先级  当前符号优先级小于或者等于符号栈顶的符号的优先级,//从数字栈弹出两个数字,符号栈弹出栈顶符号,进行计算,结果加入数字栈,当前符号加入符号栈if (operatorStack.priority(ch) <= operatorStack.priority(operatorStack.peek())){num01=numeStack.pop();num02=numeStack.pop();operator=operatorStack.pop();//进行计算res=numeStack.calculator(num01,num02,operator);operatorStack.push(ch);numeStack.push(res);}else { //当前符号的优先级大于符号栈顶的符号的优先级,则直接加入符号栈
                        operatorStack.push(ch);}}else { //符号栈为空
                    operatorStack.push(ch);}}else {//不是运算符  直接进入树栈//ASCII表, 查出来的是'1' 对应的十进制为49//numeStack.push(ch-48);//某一字符为多位数时,需要当成字符串处理str+=ch;//判断ch是否为最后一个字符if (index == expression.length()-1){numeStack.push(Integer.parseInt(str));}else {//判断下一位是否是字符,下一位是字符,则将当前拼接字符串存入数字栈if (operatorStack.isOperator(expression.substring(index+1,index+2).charAt(0))){numeStack.push(Integer.parseInt(str));//把str 清空str = "";}}}//继续扫描,索引增加,并判断是否到最后index++;if (index >= expression.length()){break;}}//表达式扫描完毕后,对两个栈中元素进行计算while (true){num01=numeStack.pop();num02=numeStack.pop();operator=operatorStack.pop();numeStack.push(numeStack.calculator(num01, num02, operator));//判断结束if (operatorStack.isEmpty()){break;}}//输出结果System.out.println("result="+numeStack.pop());}}

 

转载于:https://www.cnblogs.com/jiushixihuandaqingtian/p/11241049.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python color属性_使用Python制作一个带GUI界面的词云自动生成工具(连载七)

前几篇向大家介绍了词云自动生成工具&#xff08;GUI&#xff09;的详解GUI词云自动生成工具中词云属性设置界面的实现&#xff08;连载六&#xff09;。通过前面内容我们基本构建出了词云自动生成工具的主要框架。本篇结合tkinter中的filedialog和colorchooser的使用&#xff…

com 名字对象(3)使用IMoniker

一.名字对象比较 Hash和IsEqual方法 IMoniker* moniker2NULL; CreateFileMoniker(OLESTR("F:\\test.xlsx"),&moniker2); DWORD dw; moniker2->Hash(&dw); IMoniker* moniker3NULL; CreateFileMoniker(OLESTR("F:\\test2.xlsx"),&moniker3);…

python爬取微博评论_用 python 爬取微博评论并手动分词制作词云

最近上海好像有举行个什么维吾尔族的秘密时装秀&#xff0c;很好看的样子&#xff0c;不过我还没时间看。但是微博上已经吵翻了天&#xff0c;原因是好吧&#xff0c;这不是我们关心的&#xff0c;我的心里只有学习我爱学习 Python 爬虫 本次爬取的是这条微博这条微博 微博的移…

公众号出现该公众号提供的服务出现故障分析

近日公众号出现了 出现该公众号提供的服务出现故障的错误提示 百度了一下这种错误的可能性 在这里插入图片描述 1. 程序后台未回复微信success 2. 5秒内无响应 3. 授权给了多个第三方平台&#xff0c;其中一个不可用。 4. ToUserName和 FromUserName 参数不正确无法找到接收…

数据结构之栈对逆BoLand表达式的计算

一. 后缀表达式: 后缀表达式,逆波兰表达式,是指运算符位于操作符之后,计算机对该式是从做到右进行计算,计算过程如下例子 二.计算思路 对于后缀表达式的计算,需要一个栈即可, 即遇见数字压栈,遇见运算符从栈中取出两个数,根据运算进行操作, 需要注意的是,减法以及除法都是后出栈…

[html] html中在span标签里面可以放那些标签?

[html] html中在span标签里面可以放那些标签&#xff1f; 都可以&#xff0c;但原则上不要。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

得到WebService应用程序的路径

[WebMethod] public string ShowWebServicePhysicalPath() { string strpathSystem.Web.HttpContext.Current.Request.PhysicalPath; return strpath.Substring(0,strpath.LastIndexOf("\")); }转载于:https://www.cnblogs.com/lanbaoming/archive/2…

c++ fork 进程时 共享内存_c/c++ Linux 进程间通信------共享内存

1. 什么是共享内存共享内存(Shared Memory)&#xff0c;指两个或多个进程共享一个给定的存储区。进程可以将同一段共享内存连接到它们自己的地址空间中&#xff0c;所有进程都可以访问共享内存中的地址&#xff0c;就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进…

云服务器个人入门主机对比和分析

最近阿里云的云服务器快到期了&#xff0c;看看了市场上的各大云主机&#xff0c;然后进行了整理和对比希望对初次买云主机的用户有帮助 阿里云 学生主机腾讯云 学生主机百度云 学生主机华为云金山云滴滴云 DC2云服务器品牌类型CPU内存带宽硬盘价格所需用户阿…

[html] const nums1 = [1, 2, 2, 1], nums2 = [2] 交集是什么?

[html] const nums1 [1, 2, 2, 1], nums2 [2] 交集是什么&#xff1f; let a [1, 2, 2, 1]; let b [2]; let aSet new Set(a); let bSet new Set(b);let intersection Array.from(new Set(a.filter(v > bSet.has(v)))) console.log(intersection); // [2]个人简介 …

数据结构之栈实现中缀转后缀并计算结果

一.中缀变后缀过程分析 给定一个中缀,最后变为后缀的过程其实并不算复杂,下面分析一下过程: 1. 首先面对一个中缀表达式,我们需要两个栈,一个用来存放运算符,即符号栈 operatorstack,一个用来存放数字,运算符,即数字栈 numStack 2. 开始扫描中缀表达式 3.遇到操作数时,我们直接…

TreeView 小技巧

1、在把treeview的check事件给封了之后&#xff0c;在双击的情况下仍然会选中。这个要通过处理消息来解决。 解决&#xff1a; 在调用的时候将这个事件给过滤掉 if (e.Node.ForeColor Color.Gray) e.Cancel true; 自定义treeview中加入以下方法 protected ove…

python爬取新闻网站内容_python爬虫案例:抓取网易新闻

此文属于入门级级别的爬虫&#xff0c;老司机们就不用看了。 本次主要是爬取网易新闻&#xff0c;包括新闻标题、作者、来源、发布时间、新闻正文。 首先我们打开163的网站&#xff0c;我们随意选择一个分类&#xff0c;这里我选的分类是国内新闻。然后鼠标右键点击查看源代码&…

PHPRedis教程之geo

前言 支持 GEO 系列命令的 Redis 版本从 3.2.0 起开始才可以使用&#xff0c;所以之前版本就不要想了。 函数列表 geoadd - 将指定的地理空间项&#xff08;纬度&#xff0c;经度&#xff0c;名称&#xff09;添加到指定的键&#xff0c; 数据作为有序集存储在 Redis 中。 GEOA…

如何查看QQ和微信查看授权过那些应用?

平时生活中&#xff0c;要登录一些网站或者app时&#xff0c;为了省事儿&#xff0c;都用第三方登录&#xff0c;登录是简单快捷了一些 时间长了,授权过的那些应用都不知道了&#xff0c;甚至一些应用你没用去授权权限也一直开放给别人网站的 所以为了自己帐号的安全还是有必…

[html] 说说你对H5的SharedWorker的理解,它有什么运用场景?

[html] 说说你对H5的SharedWorker的理解&#xff0c;它有什么运用场景&#xff1f; 一种特定类型的 worker&#xff0c;可以从几个浏览上下文中访问&#xff0c;例如几个窗口、iframe 或其他 worker。多个标签页之间通信个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后…

Spring 注解AOP 入门

XML <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:context"http://www.springframework.org/sche…

python常用函数的用法_python3 文件操作常用函数用法示例

1. file.close() 关闭文件。关闭后文件不能再进行读写操作&#xff0c;需要重新打开才能进行读写。f open(demo.text , r) # 使用只读方式打开文本 print(f.read()) # 打印demo.text文件内容 f.close() # 关闭文件 2. file.flush() 将缓存区中的数据立刻写入文件&#xff0c;同…

[html] 制作页面时,前端如何适应各种异形屏?

[html] 制作页面时&#xff0c;前端如何适应各种异形屏&#xff1f; 主要内容区域大小固定&#xff0c;固定在页面中间&#xff0c;两边可伸缩 width:1200px; margin:0 auto;个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很…

awk的妙用

终端形式有人说awk的优势在于可以个性化输出命令&#xff0c;这么说来太抽象了&#xff0c;假如我们查看占用6379端口的进程信息。 lsof -i:6379 输出结果&#xff1a; COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME redis-ser 17474 root 6u IPv6 71242 …