利用栈的四则运算

本文详细解析了如何将中缀表达式转换为后缀表达式,并利用栈进行计算的过程。通过实例说明了操作符优先级、括号处理及计算技巧,帮助读者深入理解表达式求值算法。

利用表达式求值首先要会将中缀表达式变为后缀表达式,过程如下:
中缀表达式:(A+B)*C-D/E = ( ( (A+B)C ) - (D/E) ),将符号移到对应括号的后面。
后缀表达式:AB+C
DE/-。
将表达式转化为后缀后能方便利用栈进行计算。

利用栈来化为后缀表达式的步骤如下:
从左往右扫描中缀表达式。当读到数字时,加入后缀表达式。读到操作符时,将其与操作符栈顶进行比较,如果当前符号优先级或为栈空,就压入栈。否则,一个个往外pop到后缀表达式中,直到当前操作符的优先级比栈顶的高,才将其push。

比较难理解的是,为什么遇到优先级更高的就push,而更低的出现就要pop?
首先要知道计算机算时不会先看后面的,所以我们得把先算的放前面。而在四则运算中是有优先级的,优先级高的即使顺序上在后面也要先进行计算。而栈是FILO,所以可以利用栈来实现先算优先级更高的运算。而如果优先级并不更高就要遵守“在前面的先算”的原则了。所以要pop完优先级更高或一样的。

但如果中缀表达式中有括号呢?
括号的优先级是最高的,要先算。所以对括号的处理:当遇到’(‘时,压入操作符栈;当遇到’)‘时,因为括号里的要先算,所以一直pop直到’('出现。

而有了后缀表达式,计算就十分方便了。如果是数字,就压入栈,如果是操作符,就pop两个数字,计算后放回栈中。最后只会剩下一个数,就是结果。

注意点:

  1. 因为栈是FILO,所以后一个弹出的数字在运算中是在前面的。
  2. 除法可能导致小数,数字类型设置为浮点。
  3. 有两个栈:操作符栈在生成后缀表达式时使用,数字栈在计算时使用。
以下是一个简单的四则运算答题系统Python代码,利用实现了计算表达式的功能。 ```python class Stack: def __init__(self): self.items = [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def is_empty(self): return len(self.items) == 0 class Calculator: def __init__(self): self.stack = Stack() def calculate(self, expr): for token in expr: if token.isdigit(): self.stack.push(int(token)) else: op1 = self.stack.pop() op2 = self.stack.pop() if token == '+': self.stack.push(op2 + op1) elif token == '-': self.stack.push(op2 - op1) elif token == '*': self.stack.push(op2 * op1) elif token == '/': self.stack.push(op2 / op1) return self.stack.pop() if __name__ == '__main__': calculator = Calculator() expr = input('请输入表达式:').split() result = calculator.calculate(expr) print(f'计算结果为:{result}') ``` 这个程序要求用户输入一个包含数字和运算符的表达式,然后使用来计算表达式的结果。程序首先创建一个名为`Stack`的类来实现的功能,然后创建一个名为`Calculator`的类来实现计算器的功能。`Calculator`类包含一个名为`stack`的对象,以及一个名为`calculate`的方法,用于计算表达式的结果。 在`calculate`方法中,程序首先遍历表达式中的每个字符,如果是数字则将其转换为整数并压入中,如果是运算符则弹出顶的两个数字进行计算,然后将计算结果压入中。最后,`calculate`方法返回的最后一个元素,即为计算结果。 在程序的主函数中,首先创建一个`Calculator`对象,然后要求用户输入一个表达式,使用`split`方法将表达式拆分成数字和运算符的列表,然后调用`calculate`方法计算表达式的结果,并打印计算结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值