二更,理完思路后自己用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