栈与后缀表达式(Python)

本文介绍了栈的数据结构及其特点,并详细讲解了后缀表达式的定义和计算方法。通过Python代码展示了如何实现后缀表达式的转换和计算,包括operator_level、regular_to_infix_converter、infix_to_reverse_polish_converter和reverse_polish_notation_calculator等函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

最近在复习数据结构的相关的知识的时候,学习到了后缀表达式的相关知识。( ̄▽ ̄)~*

所以,想着在python中练练手,便写下来了我今天所想要分享的代码。ヾ(゚∀゚ゞ)

让我们话不多说,开始我们的讲解吧(o゚▽゚)o

第一次观看我博客的小朋友,请移步到我的文章我的helper模块进行观看


一、知识点讲解

1.栈

说到后缀表达式,那就不能跳过“栈”这个知识点。(`・ω・´)

1.定义和特点

栈,又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。
以上内容来自百度知道

它最大的特点便是FILO(先进后出)

这个特点非常的适用于后缀表达式或前缀表达式的计算实现。

2.操作

  • 初始化:initialize
  • 进栈:push
  • 出栈:pop
  • 长度:stack_length
  • 读取:get_top_element(一般栈的读取操作都是读取最顶端的元素)

3.具体代码

class Stack:
    def __init__(self, max_size):
        self.__stack_list = []
        self.__max_size = max_size
        self.__stack_length = 0
    def initialize(self):
        self.__stack_list.clear()
        self.__stack_length = 0
    def push(self, element):
        if self.__max_size == self.__stack_length:
            return False
        else:
            self.__stack_length += 1
            self.__stack_list.append(element)
    def pop(self):
        if self.__stack_length == 0:
            return False
        else:
            self.__stack_length -= 1
            return self.__stack_list.pop()
    def stack_length(self):
        return self.__stack_length
    def get_top_element(self):
        if self.__stack_length == 0:
            return False
        return self.__stack_list[self.__stack_length - 1]
    def stack_self(self):
        return self.__stack_list

以上的代码我放进了我的helper模块,防止很多人是跳着看的,遂我再放上一次链接:我的helper模块


2.后缀表达式

1.定义

一个表达式E的后缀形式可以如下定义:
(1)如果E是一个变量或常量,则E的后缀式是E本身。
(2)如果E是E1 op E2形式的表达式,这里op是任何二元操作符,则E的后缀式为E1’E2’ op,这里E1’和E2’分别为E1和E2的后缀式。
(3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。
以上内容来自百度百科

2.计算方法

新建一个表达式,如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
以上内容来自百度百科


二、应用

1.具体代码

def operator_level(operator):
    if operator == '+' or operator == '-':
        return 1
    elif operator == '*' or operator == '/':
        return 2
        
def regular_to_infix_converter(regular_string):
    ifx_list = []
    number_string = ''
    is_number_flag = True

    for element in regular_string:
        if element == ' ':
            continue
### 后缀表达式计算解析 后缀表达式(也称逆波兰表示法)是一种计算机易于处理的数学表达式形式。通过结构,可以高效地实现对后缀表达式的求值[^1]。以下是一个完整的 Python 实现示例,展示如何解析计算后缀表达式。 #### 代码实现 ```python def evaluate_postfix(expression): """ 计算后缀表达式的值。 :param expression: 后缀表达式字符串,以空格分隔 :return: 表达式的计算结果 """ stack = [] operators = ['+', '-', '*', '/'] # 将表达式按空格分割成列表 tokens = expression.split() for token in tokens: if token not in operators: # 如果是操作数 stack.append(float(token)) # 转换为浮点数并压入中 else: # 如果是运算符 right_operand = stack.pop() # 弹出顶元素作为右操作数 left_operand = stack.pop() # 再次弹出顶元素作为左操作数 result = 0 if token == '+': result = left_operand + right_operand elif token == '-': result = left_operand - right_operand elif token == '*': result = left_operand * right_operand elif token == '/': result = left_operand / right_operand stack.append(result) # 将计算结果压回中 return stack[0] # 中最后一个元素即为最终结果 # 示例用法 if __name__ == "__main__": postfix_expression = "3 4 + 2 * 7 /" # 后缀表达式示例 result = evaluate_postfix(postfix_expression) print(f"后缀表达式 '{postfix_expression}' 的计算结果为: {result}") ``` #### 代码说明 - **的使用**:是一种先进后出的数据结构,非常适合处理后缀表达式。操作数被依次压入中,遇到运算符时从中弹出两个操作数进行计算,并将结果重新压入中[^1]。 - **浮点数处理**:为了支持更广泛的数值类型,代码中将操作数转换为浮点数[^3]。 - **运算符支持**:当前代码支持加、减、乘、除四种基本运算符。可以根据需求扩展支持更多运算符。 #### 示例输出 对于后缀表达式 `"3 4 + 2 * 7 /"`,程序将输出: ``` 后缀表达式 '3 4 + 2 * 7 /' 的计算结果为: 2.0 ``` ### 中缀表达式转后缀表达式 如果需要将中缀表达式转换为后缀表达式,可以参考以下算法[^2]: ```python def infix_to_postfix(expression): """ 将中缀表达式转换为后缀表达式。 :param expression: 中缀表达式字符串 :return: 转换后的后缀表达式字符串 """ precedence = {'+': 1, '-': 1, '*': 2, '/': 2} # 运算符优先级 stack = [] output = [] tokens = expression.replace(" ", "") # 去掉空格并分割为字符列表 i = 0 while i < len(tokens): token = tokens[i] if token.isdigit(): # 如果是数字 num = "" while i < len(tokens) and (tokens[i].isdigit() or tokens[i] == '.'): num += tokens[i] i += 1 output.append(num) # 将完整数字加入输出列表 continue elif token == '(': stack.append(token) elif token == ')': while stack and stack[-1] != '(': output.append(stack.pop()) stack.pop() # 弹出左括号 elif token in precedence: # 如果是运算符 while stack and stack[-1] != '(' and precedence.get(stack[-1], 0) >= precedence[token]: output.append(stack.pop()) stack.append(token) i += 1 while stack: output.append(stack.pop()) # 将剩余的运算符弹出到输出列表中 return " ".join(output) # 示例用法 if __name__ == "__main__": infix_expression = "1-(2-3*(4-6/3)*2)" postfix_expression = infix_to_postfix(infix_expression) print(f"中缀表达式 '{infix_expression}' 转换为后缀表达式为: {postfix_expression}") ``` #### 示例输出 对于中缀表达式 `"1-(2-3*(4-6/3)*2)"`,程序将输出: ``` 中缀表达式 '1-(2-3*(4-6/3)*2)' 转换为后缀表达式为: 1 2 3 4 6 3 / - * 2 * - - ``` ### 结合计算转换 可以通过先将中缀表达式转换为后缀表达式,再对后缀表达式进行求值来完成整个计算过程[^3]。 ```python if __name__ == "__main__": infix_expression = "1-(2-3*(4-6/3)*2)" postfix_expression = infix_to_postfix(infix_expression) result = evaluate_postfix(postfix_expression) print(f"中缀表达式 '{infix_expression}' 的计算结果为: {result}") ``` #### 示例输出 ``` 中缀表达式 '1-(2-3*(4-6/3)*2)' 的计算结果为: 9.0 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值