Python栈的应用:算法竞赛中的栈技巧
在算法竞赛中,栈的应用十分广泛。以下是一些常见的栈技巧:
- 模拟
在模拟中,栈可以使代码更加简洁和易读。例如,在模拟一个简单的计算器时,可以使用栈来储存操作数和运算符。
下面是一个简单的例子:
def calculate(expression): numbers = [] operators = [] for i in expression: if i.isdigit(): numbers.append(int(i)) elif i == "+" or i == "-": while operators and operators[-1] != "(": operator = operators.pop() num2 = numbers.pop() num1 = numbers.pop() if operator == "+": numbers.append(num1 + num2) else: numbers.append(num1 - num2) operators.append(i) elif i == "(": operators.append(i) elif i == ")": while operators[-1] != "(": operator = operators.pop() num2 = numbers.pop() num1 = numbers.pop() if operator == "+": numbers.append(num1 + num2) else: numbers.append(num1 - num2) operators.pop() while operators: operator = operators.pop() num2 = numbers.pop() num1 = numbers.pop() if operator == "+": numbers.append(num1 + num2) else: numbers.append(num1 - num2) return numbers[-1]
- 字符串处理
在字符串处理中,栈可以帮助我们处理括号匹配、逆序输出等问题。
下面是一个例子:
def reverse_string(s): stack = [] for i in s: stack.append(i) output = "" while stack: output += stack.pop() return output
- 搜索
在搜索中,栈可用于Depth-first search(DFS)算法。
下面是一个例子:
graph = { "A": ["B", "C"], "B": ["D", "E"], "C": ["F"], "D": [], "E": ["F"], "F": [] } def dfs(start): visited = [] stack = [start] while stack: node = stack.pop() if node not in visited: visited.append(node) neighbors = graph[node] for neighbor in neighbors: stack.append(neighbor) return visited
在以上例子中,我们使用了一个列表作为 DFS 的栈。我们首先将初始节点添加到栈中,并在每个步骤中弹出一个节点。我们用 "visited" 列表来存储已访问的节点,并将它添加到 "visited" 列表中。最后,我们检查节点的邻居,并将它们添加到栈中以进行后续搜索。我们重复上述操作,直到栈为空。最终,我们返回 "visited" 列表。
相关文章