三种表达式

解析中缀、前缀和后缀表达式的求值过程

 

表达式:主要由操作数、操作符组成。

 

 

中缀表达式:操作符在两个操作数之间的表达式
      如:a/(b-c)+d*e
前缀表达式:操作符放在两个操作数之前的表达式 从后往前求值
      如:+/a-bc*de
后缀表达式:操作符放在两个操作数之后的表达式(逆波兰表达式)从前往后求值
      如:abc-/de*+

非中缀表达式的求值过程,一定要看明白是前缀还是后缀。具体的过程始终都是先找到操作符,然后反向去找最近的操作数,进行合并求值。

后缀表达式中无括号,求值时无需考虑操作符的优先级,计算简便,故编译程序中常用。对中缀表达式求值的过程为:
(1)中缀表达式->后缀表达式
(2)对后缀表达式求值





后缀表达式求值:
 (1)从左往右顺序扫描后缀表达式;
 (2)遇到操作数就进栈;
 (3)遇到操作符就从栈中弹出两个操作数,并执行该操作符规定的运算;并将结果进栈;
 (4)重复上述操作,直到表达式结束。弹出栈顶元素即为结果。
### 栈表达式三种表示方式 栈表达式主要可以分为 **中缀表达式**、**前缀表达式** 和 **后缀表达式** 三种形式。这三种表达式在数据结构中有着广泛的应用,特别是在表达式求值和编译器设计领域。 #### 1. 中缀表达式 中缀表达式是人们最常用的数学表达式形式,其特点是操作符位于两个操作数之间。例如:`9 + (3 - 1) × 3 + 10 / 2`。 中缀表达式的求值需要考虑运算符的优先级和括号的作用[^1]。由于中缀表达式的复杂性,通常会先将其转换为前缀或后缀表达式再进行求值。 #### 2. 前缀表达式 前缀表达式也称为波兰式,其特点是操作符位于两个操作数之前。例如:`+ 9 × - 3 1 3 / 10 2`。 前缀表达式的计算方法是从右到左扫描表达式,遇到数字时压入栈中,遇到操作符时弹出栈顶的两个数字进行运算,并将结果重新压入栈中,直到整个表达式处理完毕[^2]。 #### 3. 后缀表达式 后缀表达式也称为逆波兰式,其特点是操作符位于两个操作数之后。例如:`9 3 1 - 3 × + 10 2 / +`。 后缀表达式的计算方法是从左到右扫描表达式,遇到数字时压入栈中,遇到操作符时弹出栈顶的两个数字进行运算,并将结果重新压入栈中,直到整个表达式处理完毕[^2]。 ### 数据结构中栈的实现方式 栈是一种遵循“后进先出”(LIFO)原则的数据结构。其实现方式主要有两种:**数组实现** 和 **链表实现**。 #### 1. 数组实现 使用数组实现栈时,需要定义一个固定大小的数组来存储栈中的元素,并用一个指针(通常称为`top`)指向栈顶元素的位置。初始时,`top`被设置为`-1`,表示栈为空。当向栈中添加元素时,`top`加一并存入新元素;当从栈中移除元素时,取出`top`位置的元素并将`top`减一[^3]。 ```python class Stack: def __init__(self, capacity): self.top = -1 self.capacity = capacity self.array = [None] * capacity def is_empty(self): return self.top == -1 def push(self, item): if self.top == self.capacity - 1: raise Exception("Stack Overflow") self.top += 1 self.array[self.top] = item def pop(self): if self.is_empty(): raise Exception("Stack Underflow") popped = self.array[self.top] self.top -= 1 return popped def peek(self): if self.is_empty(): raise Exception("Stack is Empty") return self.array[self.top] ``` #### 2. 链表实现 使用链表实现栈时,每个节点包含一个数据域和一个指向下一个节点的指针。栈顶由一个指针(通常称为`top`)指向链表的第一个节点。当向栈中添加元素时,创建一个新节点并将`top`指向该节点;当从栈中移除元素时,将`top`指针移动到下一个节点[^4]。 ```python class Node: def __init__(self, data): self.data = data self.next = None class Stack: def __init__(self): self.top = None def is_empty(self): return self.top is None def push(self, item): new_node = Node(item) new_node.next = self.top self.top = new_node def pop(self): if self.is_empty(): raise Exception("Stack Underflow") popped = self.top.data self.top = self.top.next return popped def peek(self): if self.is_empty(): raise Exception("Stack is Empty") return self.top.data ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值