当前位置: 首页 > 后端技术 > Java

昨天去一个大厂面试,居然让我做四项算术运算,还好我够聪明

时间:2023-04-01 23:24:46 Java

面试官:请问四次算术运算是怎么计算的?比如1+2*(3+4)-5。我:先计算括号内,再计算括号外,先乘除,再加减,最后等于10。面试官一愣片刻,说:也许我可以解释清楚,我想问的是如何用电脑计算?我尴尬地笑了笑,随即说:对于计算机来说,简单的两个数的加减乘除很容易,但如果乘除一定要在加减之后进行,再加上几个括号,这会很容易。变得更加复杂。为了使计算机更容易理解,前人对四种算术运算引入了新的表示法。逆波兰表示法有一位波兰数学家名叫:扬·卢卡谢维茨(Jan?ukasiewicz),这就是他:他在1920年引入了一种新的数学表达形式:逆波兰表示法(RPN,即ReversePolishnotation)。在逆波兰语中,不需要括号来标识运算符的优先级,所有的运算符都放在操作数之后,所以也叫后缀表达式。我们在小学的时候,经常用到中缀表达式,即运算符在操作数之间,比如:1+2*(3+4)-5,对应的反波兰表达式为:1234+*+5-。逆波兰公式的计算需要根据逆波兰公式的计算结果使用栈(Stack)数据结构。栈(Stack)是一种线性表,仅限于在表尾进行插入或删除操作,遵循后进先出(LIFO)的原则。具体步骤如下:从左到右扫描表达式,如果当前字符是数字,则将其入栈。如果当前字符是运算符,则弹出栈顶的两个元素,进行相应的操作,并将结果压回栈中。最后扫描表达式时,计算结果入栈。我们以1234+*+5-为例:输入操作栈注释1push12push1,23push1,2,34push1,2,3,4+加法操作1,2,73、4出栈,结果7入栈*乘法运算1、142、7出栈,结果14入栈+加法运算151、14出栈,结果15入栈栈5入栈15,5-减法运算1015,5出栈,结果10入栈,最终计算结果为:10。反波兰转换计算机可以计算出根据逆波兰公式得到的结果,那么问题来了!如何将我们常用的中缀表达式转换成反波兰语?还需要用到栈的数据结构。具体步骤如下:从左到右扫描中缀表达式,如果当前字符为数字则直接输出。如果当前字符是一个运算符,则用栈顶运算符确定其优先级。如果是右括号或者比栈顶运算符优先级低,则将栈中的运算符依次出栈输出,然后将当前运算符压入栈中。最后,扫描中缀表达式后,输出的是反向波兰语形式。我们以1+2*(3+4)-5为例:input操作栈output1output1+push+12output+12*push+,*12(push+,*,(123output+,*,(123+依次入栈+,*,(,+1234依次输出+,*,(,+1234)to(+,*1234+-依次出栈out,then-push-1234+*+5output-1234+*+5依次popout1234+*+5-最终反波兰公式为:1234+*+5-.看到面试官满意的笑容,我擦了擦额头的汗,还好我够聪明,最后谢谢大家的点赞和关注,你又帅又漂亮。