千家信息网

Python中怎么使用栈实现简易计算器

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"Python中怎么使用栈实现简易计算器",在日常操作中,相信很多人在Python中怎么使用栈实现简易计算器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2026年11月02日Python中怎么使用栈实现简易计算器

这篇文章主要介绍"Python中怎么使用栈实现简易计算器",在日常操作中,相信很多人在Python中怎么使用栈实现简易计算器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Python中怎么使用栈实现简易计算器"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

主要的思路:read - parse - print - loop。

read 阶段是指读取用户在提示符(cal> )之后输入的字符串。

parse 阶段包括:将用户输入的字符串分割成单个对象比如:符号 +,或者数字 1.2 。其次将中缀表达式转化后缀表达式,接下来计算后缀表达式的数值。

print 阶段指的是将 parse 阶段的数值打印在终端上。

loop 阶段是指重复上述操作,除非用户输入 exit 符号或者 Ctrl + C 终止程序运行。

实现效果图:

栈

为了实现后面的中缀、后缀表达式,我们需要借助栈这种数据结构。

栈是一种先进后出的数据结构,函数调用时就会使用栈来保存当前程序的地址及其他信息,前面的深度优先搜索就是基于栈实现的。

之前写了一篇文章介绍了栈的用法,下面简单说明栈的使用:

push 函数在栈的顶部添加元素,pop 函数删除栈顶的元素,top 函数查看栈顶元素。

class Stack: def push(self, value: T) -> None: pass def pop(self) -> T: pass def top(self) -> T: pass

分词

分词是 parse 阶段的重要部分。

  • 我们定义符号 + - * / ( )。

  • 将这些字符串中的这些符号替换为:空格 + 符号 + 空格

+ => 空格+空格
  • 将字符串按空格分割,得到最终的分词

经过上述操作,就可以实现对正数以及操作符的分词功能。

# Python高效编程def tokenize(expression: str) -> Generator[str, None, None]: for symbol in symbols: # 替换字符串 expression = expression.replace(symbol, f" {symbol} ") # 分割字符串 seq: List[str] = expression.split()

为了实现对负数的分词,我们需要迭代分词序列,将'-' 与后面的数字转换成一个整体。我们有两种情况将 - 视作负号,第一种情况,负号位于字符串的开头;第二种情况,负号前一个符号为左括号。

# Python高效编程for i, item in enumerate(expression.split()): if item == "-": # 两种情况下,当前符号设置为 "" # 下一个符号设置为负数 if i - 1 < 0 or seq[i - 1] == "(": seq[i] = "" seq[i + 1] = f"-{seq[i + 1]}" # 若字符串不为空,打印字符串 if seq[i]: yield seq[i]

中缀表达式

中缀表达式就是我们写的各种表达式,如 3 + 2 * 4。我们希望将其转化为后缀表达式,示例如下:

中缀表达式 ==> 1 + 5 * 4 + (3 * 2 + 4) * 6后缀表达式 ==> 1 5 4 * + 3 2 * 4 + 6 * +

我们需要准备一个栈 stack ,用于临时存放操作符;准备一个序列 seq,用来存放输出结果,也就是后缀表达式。

转化规则:

迭代分词序列,遇到数字,就将数字输出到序列 seq 中。

定义各个符号优先级,其中 乘除 > 加减 > 右括号。比较当前符号与栈顶元素的优先级,如果当前元素的优先级小于等于栈顶元素的优先级,就弹出栈顶元素,输出到 seq 序列中,然后将当前元素压入栈中。如果当前元素的优先级大于栈顶元素的优先级,或者当前元素为右括号,我们直接将当前元素压入栈中。

如果遇到左括号,我们就弹出栈中元素,并输出到 seq 序列中。其中,左右括号不输出到序列中。

最后,将栈中剩余的符号输出到 seq 序列中。

# Python高效编程# 迭代 1 + 5 * 4 + (3 * 2 + 4) * 6# 读入 1 并输出到 seq 中,将 + 压入栈中# 读入 5 并输出到 seq 中stack ==> +seq ==> 1 5# 读入 *, * 优先级 > + 优先级# 将 * 压入栈中, 读入 4 并输出stack ==> + *seq ==> 1 5 4# 读入 +, + 优先级 < * 优先级# 将 * 输出到 seq 序列中# + 优先级 <= + 优先级,+ 输出# 将 + 压入栈中stack ==> +seq ==> 1 5 4 * +# 读入 (, 压入栈中,读入 3,压入栈中stack ==> + (seq ==> 1 5 4 * + 3# 读入 *, 压入栈中,读入 2,压入栈中stack ==> + ( *seq ==> 1 5 4 * + 3 2# 读入 +,* 输出,+ 压入栈中, 4 输出stack ==> + ( +seq ==> 1 5 4 * + 3 2 * 4# 读入 ),+ 输出,弹出 (stack ==> +seq ==> 1 5 4 * + 3 2 * 4 +# 读入 *, 压入栈中, 6 输出stack ==> + *seq ==> 1 5 4 * + 3 2 * 4 + 6# 将栈中剩余符号输出stack ==>seq ==> 1 5 4 * + 3 2 * 4 + 6 * +

代码如下:

# Python高效编程def parse_infix(expression: str) -> List[str]: stack: Stack[str] = Stack() result: List[str] = [] for expr in tokenize(expression): if not is_float(expr) and expr not in symbols: raise SymbolError() if is_float(expr): result.append(expr) elif expr == ")": while stack.top != "(": result.append(stack.pop()) stack.pop() elif expr == "(": stack.push(expr) elif stack.top and compare_priority(expr, stack.top): result.append(stack.pop()) while stack.top and compare_priority(expr, stack.top): result.append(stack.pop()) stack.push(expr) else: stack.push(expr) while stack: result.append(stack.pop()) return result

后缀表达式

后缀表达式的规则:遇到数值就压入栈中;遇到符号,就从栈中弹出两个元素,计算两个元素运算结果,将得到的结果压入栈中。

# Python高效编程def parse_sufix(expression: List[str]) -> float: stack: Stack[str] = Stack() result: float = 0.0 for expr in expression: if is_float(expr): stack.push(expr) else: elem1: str = stack.pop() elem2: str = stack.pop() result = evaluate(expr, float(elem2), float(elem1)) stack.push(str(result)) if stack: result = float(stack.pop()) return result

到此,关于"Python中怎么使用栈实现简易计算器"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

元素 输出 符号 表达式 优先级 字符 字符串 序列 后缀 阶段 中缀 括号 空格 编程 简易 计算器 函数 情况 数字 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网公司装修 重庆互联网络科技 远信互联网科技 南京欣网互联网科技 奇酷互联网络科技公司 互联网金融科技平台 佰商互联网科技有限公司 互联网实体化科技化 哈尔滨新华互联网科技学院 团飞科技与伯堂互联网服务平台 宁夏众和广鑫互联网科技有限公司 福建科技产业互联网发展 互联网还是高科技吗 成都互联网科技公司工作好不好 乌鲁木齐新华智原互联网科技学校 互联网金融科技元年 互联网金融科技公司的优势 承德科技产业互联网平台 互联网科技创业计划的风险分析 武汉亿视互联网科技有限公司 山东特亿宝互联网科技有限公司 奇酷互联网科技公司 腾讯科技 互联网女皇 融贸通互联网科技 互联网科技有限公司 翻译 老年人脱离互联网科技的作文 互联网和高科技公司 互联网科技实习生岗位职责 晓花互联网科技有限公司网址 合肥互联网科技公司公章图片
0