01栈与队列
01栈与队列
1. 栈
满足为卡特兰数。
1.1 后缀表达式
中缀表达式转换为后缀表达式
precedence = {'(': 0, '+': 1, '-': 1, '*': 2, '/': 2}
def infix2postfix(infix: str) -> str:
ops = []
postfix = []
for c in infix:
if c.isdigit():
postfix.append(c)
elif c == '(':
ops.append(c)
elif c == ')':
while ops and ops[-1] != '(':
postfix.append(ops.pop())
ops.pop()
else:
while ops and precedence[ops[-1]] >= precedence[c]:
postfix.append(ops.pop())
ops.append(c)
while ops:
postfix.append(ops.pop())
return ''.join(postfix)
后缀表达式计算
def cal_postfix(postfix: str) -> int:
stack = []
for c in postfix:
if c.isdigit():
stack.append(int(c))
else:
b = stack.pop()
a = stack.pop()
stack.append(cal_op(c, a, b)) # 根据c属于什么op(+-/*)计算
return stack.pop()
1.2 前缀表达式
中缀表达式转换为前缀表达式,考虑反转
def infix2prefix(infix: str) -> str:
infix = [{"(": ")", ")": "("}.get(c, c) for c in infix[::-1]]
ops = []
prefix = []
for c in infix:
if c.isdigit():
prefix.append(c)
elif c == '(':
ops.append(c)
elif c == ')':
while ops and ops[-1] != '(':
prefix.append(ops.pop())
ops.pop()
else:
# 注意反转后是右结合,因此是>而不是>=
while ops and precedence[ops[-1]] > precedence[c]:
prefix.append(ops.pop())
ops.append(c)
while ops:
prefix.append(ops.pop())
return ''.join(reversed(prefix))
计算前缀表达式
def cal_prefix(prefix: str) -> int:
stack = []
for c in reversed(postfix):
if c.isdigit():
stack.append(int(c))
else:
a = stack.pop()
b = stack.pop()
stack.append(cal_op(c, a, b))
return stack.pop()
2. 队列
2.1 循环队列
class CircularQueue:
def __init__(self, size: int):
self.size = size
self.queue = [None] * size
self.front = 0
self.rear = 0
def is_empty(self):
return self.front == self.rear
def is_full(self):
return self.front == self._next(self.rear)
def enqueue(self, item: Any):
self.queue[self.rear] = item
self.rear = self._next(self.rear)
def dequeue(self) -> Any:
item = self.peek()
self.front = self._next(self.front)
return item
def peek(self) -> Any:
return self.queue(self.front)
def _next(self, x):
return (x + 1) % self.size