带括号的简单四则计算器(思路)
二更,理完思路后自己用Java写了个最简单的计算器
https://blog.csdn.net/weixin_42324771/article/details/90144707
以下是原文
网上有很多,但还是想看完了自己顺一遍加深印象
目标
如何编程实现计算(3+2)*5 的结果呢,即带括号的四则运算
理论知识
首先这个式子(3+2)*5 是我们所习惯的表示方法,叫做中缀表达式,然而对计算机而言它可能不太习惯了喵,我们得找个计算机喜欢的,即后缀表达式,那么问题来了,怎样将我们习惯的中缀表达式转换成计算器稀饭的后缀表达式呢?这里要用到栈(话说我当年真的曾经为栈到底是啥苦恼了好久?)
- 中缀表达式转后缀表达式(举例)
先不多说,直接上例子,就以(3+2)*5 为例,从左往右遍历,第一个是“(”,入栈。简单粗暴的用图示意一下…
第二个是数字字符“3”,直接输出
然后是“+”,因为此时栈里只有左括号,所以直接入栈
又是数字,直接输出“2”
接着是右括号“)”,敲黑板划重点了,遇到右括号要将栈内左括号之前的操作符全部输出,左括号只弹出不输出
再接着按照这个规律大家应该就已经会了
至此就已经将(3+2)*5 转换成了后缀表达式 3 2 + 5 *,这是一个最简单的例子,再来看一个复杂一点的,这里就直接贴的网上的。
网站放这,本篇也主要来源该博客,写的很详细
https://www.cnblogs.com/hantalk/p/8734511.html
中缀表达式a + b*c + (d * e + f) * g,其后缀表达式为a b c * + d e * f + g * +。
步骤如下,按照步骤一步一步试试自己写的结果是否正确
1)首先读到a,直接输出。
2)读到“+”,将其放入到栈中。
3)读到b,直接输出。
4)读到“*”,因为栈顶元素"+“优先级比” * " 低,所以将" * "直接压入栈中。
5)读到c,直接输出。
6)读到" + “,因为栈顶元素” * “的优先级比它高,所以弹出” * “并输出, 同理,栈中下一个元素” + “优先级与读到的操作符” + “一样,所以也要弹出并输出。然后再将读到的” + “压入栈中。
7)下一个读到的为”(",它优先级最高,所以直接放入到栈中。
8)读到d,将其直接输出。
9)读到" * “,由于只有遇到” ) “的时候左括号”(“才会弹出,所以” * "直接压入栈中。
10)读到e,直接输出。
11)读到" + “,弹出” * “并输出,然后将”+“压入栈中。
12)读到f,直接输出。
13)接下来读到“)”,则直接将栈中元素弹出并输出直到遇到”(“为止。这里右括号前只有一个操作符”+“被弹出并输出。
14)读到” * “,压入栈中。读到g,直接输出。
15)此时输入数据已经读到末尾,栈中还有两个操作符“*”和” + ",直接弹出并输出。
- 中缀表达式转后缀表达式(规律总结)
从左往右遍历
- 遇到操作数,直接输出。
- 遇到操作符加减乘除,如果此时栈顶(最上面的)的运算符优先级更低,直接入栈;如果更高或者同级,则将栈中运算符弹出直到遇到更低的才入栈。
- 遇到左括号直接入栈,因为左括号优先级比加减乘除都高嘛。
- 遇到右括号,弹出直到左括号,左括号只弹出不输出。
- 读到了输入的末尾,则将栈中所有元素依次弹出。
- 计算中缀表达式
好啦,现在我们已经能将中缀表达式转换成后缀表达式了,那么转换完成后,如何来计算后缀表达式的值呢?这里我们还是要用到栈喵
以最开始的(3+2)*5 为例 ,其后缀表达式为3 2 + 5 *
从左往右遍历后缀表达式,这次是遇到数字进栈,先是3,再是2
然后遇到加号,要有两个数才能加嘛,就从栈中取出两个数,相加后再将结果入栈
再是数字5,入栈
最后是乘号,同理加号,从栈内弹出两个数相乘,结果再入栈
噔噔噔,算完咯,无论是C用单片机写计算器还是Java或是C++,道理都是相同的
总结
这只是所需要的最简单的理论知识,但是在我平时学习中,往往代码能在网上找到一堆,能看懂的却不多(渣渣天性),喜欢这样的记录方式,自己能理清思路加深印象,或许还能帮到当初像我一样面对陌生知识一脸懵逼又无从求教的小白们~
之前看过的用C++写的:(转载)
https://blog.csdn.net/acm_JL/article/details/51031005
Java写的:(转载)
https://blog.csdn.net/qq_41398808/article/details/79558789?tdsourcetag=s_pcqq_aiomsg
带括号的简单四则计算器(思路)相关推荐
- 基于STM 32、矩阵键盘和独立键盘实现LCD显示的智能计算器(带括号的加减乘除运算、混合四则运算)——普中科技单片机开发试验仪嵌入式开发
0 引言 智能计算器是嵌入式开发的入门项目,本章使用STM 32芯片作为CPU,并将矩阵键盘和独立键盘作为输入外设,LCD1602作为显示屏,实现可输入的可视化智能计算器. 备注:最终生成的可执行HE ...
- 【软工Work1】四则加减乘除混合运算(带括号、真分数)
大家好,很高兴写一片博客给分享自己的这段奇妙的experience of coding! 本来想听老师建议在github上down一些代码的,但之后看网上代码都挺复杂怕难改.而且自己更简单的自己的思路 ...
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(计算器简单功能)
Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(计算器简单功能) 导读 动态演示调用python库的tkinter带你进入GUI世界(计算器简单功能) 目录 ...
- matlab实现加减乘除、乘方、开平方、带括号和结果分析的GUI计算器
matlab实现加减乘除.乘方.开平方.带括号和结果分析的GUI计算器 ,界面如下: 有源码,打赏私聊,微信和电话:15653242819.
- 设计一个简单的四则计算器
c# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u ...
- 【程序】[Qt\C++] 图形化计算器——用QT5实现带括号优先级的GUI编程计算器
一. 实验任务(实验题目.目的) 搞个图形化的代括号的计算器 二. 任务分析 假设已经有了计算器,实现按下等号的计算算法 学习qt 设置各按钮槽函数 将算法缝合进qt内 设计实现负数.小数 优化代码计 ...
- 仿iPhone计算器(带括号,MVC)
GitHub地址 仿iPhone计算器(带括号,MVC) 简述 唉,懒散了一个月,小小计算器花了不少时间,7号回校的高铁上我都在敲,怎一个"惨"字了得 总结: 这次呢,本义上是要练 ...
- 项目一:使用python tkinter模块做简单的计算器
小白第一次发博客,可能有很多问题,望指正! 讲的不是很详细,提供思路. 目录: 成果展示 代码说明 其他补充和参考资料 ------分割线-------- 1.成果展示 基本效果图: ...
- python123程序设计题说句心里话_用c++写一个简单的计算器程序
// 050305.cpp : 定义控制台应用程序的入口点. // // 050304.cpp : 定义控制台应用程序的入口点. // //四则运算 #include "stdafx.h&q ...
最新文章
- Java中super关键字的位置
- 第3周 实践项目2 建设”顺序表“算法库(可参考为模板)
- oracle mysql 效率_关于oracle 数据库效率的优化
- Python零基础教程:函数和类内建魔法属性
- SAP Fiori应用中事务锁的实现 - Transaction Lock实现机制
- linux颜色吸取工具,8 个优秀的 Linux 图形图像及色彩工具
- python返回长度值_Python 文件 truncate() 方法(截断返回截取长度)
- c ++查找字符串_C ++类和对象| 查找输出程序| 套装4
- [Unity] 战斗系统学习 4:FlowCanvas 中的 LatentActionNode
- 【SylixOS】Qt 基于FrameBuffer渲染界面
- 使用表的id+随机数做不重复的订单号
- 笔记本电脑配置知识大全
- Android内容提供者(Content provider)
- 强化学习 Q学习原理及例子(离散)附matlab程序
- 计算机怎么清空d盘内容,电脑怎么样清理D盘。
- PDF转CAD你知道有什么黑科技操作吗?
- ramda 函数 Function
- 论文阅读笔记(audio-visual相关)—Co-Separating Sounds of Visual Objects
- Windows7旗舰版SP1_32位2018.10(纯净版)
- 传智播客学习日记Day9