通过一个算法的设计来了解栈的一些应用

目录

1.前言

2.步骤

3.代码实现

4.测试

5.运行结果

6.一些思考

7.一些应用示例


1.前言

掌握堆栈的基本原理 掌握堆栈的存储结构 掌握堆栈的进栈、出栈;

判断栈空的实现方法 掌握应用堆栈实现括号匹配的原理和实现方法;

熟悉python语言编程 熟练使用python语言实现堆栈的进栈Push、插入Pop、判断栈空等操作 熟练使用堆栈实现括号匹配算法。

2.步骤

1、问题描述 一个算术表达式中包括圆括号、方括号和花括号三种形式的括号 编程实现判断表达式中括号是否正确匹配的算法;

2、算法 顺序扫描算术表达式 若算术表达式扫描完成,此时如果栈空,则正确返回(0);如果栈未空,说明左括号多于右括号,返回(-3) 从算术表达式中取出一个字符,如果是左括号("('或"["或"]"),则让该括号进栈(PUSH) 如果是右括号(")"或"]"或")": (1)、如果栈为空,则说明右括号多于左括号,返回(-2) (2)、如果栈不为空,则从栈顶弹出(POP)一个括号。若括号匹配,则转1继续进行判断;否则,说明左右括号配对次序不正确,返回(-1)。

3.代码实现

"""
1、问题描述
一个算术表达式中包括圆括号、方括号和花括号三种形式的括号
编程实现判断表达式中括号是否正确匹配的算法
2、算法
顺序扫描算术表达式
若算术表达式扫描完成,此时如果栈空,则正确返回(0);如果栈未空,说明左括号多于右括号,返回(-3)
从算术表达式中取出一个字符,如果是左括号( "("或"["或"{" ),则让该括号进栈(PUSH)
如果是右括号( ")"或"]"或"}" ):
(1)、如果栈为空,则说明右括号多于左括号,返回(-2)
(2)、如果栈不为空,则从栈顶弹出(POP)一个括号。若括号匹配,则转1继续进行判断;否则,说明左右括号配对次序不正确,返回(-1)
"""

python 复制代码
def stack_rule(str):
    # 创建一个空栈
    stack = []
    # 定义括号配对规则
    rule_map = {')': '(', ']': '[', '}': '{'}
    # 去除数字的影响 遍历到数字不用作处理
    except_int = set(rule_map.values()) # {(,[,{}

    for char in str:
        if char in except_int:
            stack.append(char)
        elif char in rule_map:
            if not stack:
                return -2  # 右括号多于左括号
            if stack[-1] != rule_map[char]:
                return -1  # 左右括号配对次序不正确
            stack.pop()

    if stack:
        return -3  # 左括号多于右括号
    return 0  # 左右括号匹配正确


def main():
    n = int(input().strip())
    results = []

    for _ in range(n):
        # str = input().strip()
        str = input()
        result = stack_rule(str)
        results.append(result)

    for result in results:
        print(result)


if __name__ == "__main__":
    main()

4.测试

"""
3、输入
第一行:样本个数,假设为n。
第二到n+1行,每一行是一个样本(算术表达式串),共n个测试样本。

4、输入样本
4

\[(1+2)3\]-1

\[(1+2\]3)-1

(1+2)3)-1]

\[(1+2)3-1

5、输出
共有n行,每一行是一个测试结果,有四种结果:
0:左右括号匹配正确 [[(1+2)3]-1]
-1:左右括号配对次序不正确 [[(1+2]3)-1]
-2:右括号多于左括号 (1+2)3-1]
-3:左括号多于右括号 [[(1+2)3-1]

6、输出样本
0
-1
-2
-3
"""

5.运行结果

6.一些思考

本次实验通过实现一个括号匹配算法,深入理解了堆栈数据结构的应用。实验基于Python语言,实现了堆栈的创建、进栈、出栈等基本操作,并将其应用于括号匹配问题。实验结果表明,堆栈结构能够高效地解决括号匹配问题。通过顺序扫描算术表达式,将左括号进栈,右括号出栈并进行匹配,可以准确地判断括号是否正确匹配。在实现过程中,通过设置集合来过滤数字等无关字符,进一步优化了算法的效率。

堆栈作为一种基本的数据结构,在实际应用中具有广泛的价值。例如,在编译器的语法分析中,堆栈用于管理符号表和语法规则的匹配;在函数调用中,堆栈用于保存函数的调用上下文和返回地址;在浏览器的前进后退功能中,堆栈用于记录用户访问的页面历史。此外,堆栈还在深度优先搜索(DFS)、回溯算法以及表达式求值等领域发挥着重要作用。

通过本次实验,进一步加深了对堆栈数据结构的理解。堆栈的"后进先出"(LIFO)特性使其非常适合处理需要反向操作的问题。例如,在表达式求值中,堆栈可以用于管理操作符和操作数的顺序,从而实现中缀表达式到后缀表达式的转换以及后续的计算。在人工智能领域,堆栈可以用于管理搜索路径或状态空间;在游戏开发中,堆栈可以用于实现撤销操作或状态回滚功能。

7.一些应用示例

在编译器的语法分析中,堆栈用于管理符号表和语法规则的匹配

复制代码
# 示例:使用堆栈检查代码中的括号是否匹配
python 复制代码
def is_balanced(code):
    stack = []
    brackets = {')': '(', '}': '{', ']': '['}
    
    for char in code:
        if char in brackets.values():  # 左括号入栈
            stack.append(char)
        elif char in brackets:  # 右括号匹配
            if not stack or stack.pop() != brackets[char]:
                return False
    return not stack  # 栈为空则匹配成功

# 测试
code_snippet = "def func() { return (1 + 2) * [3 - 4]; }"
print(is_balanced(code_snippet))  # 输出: True

在函数调用中,堆栈用于保存函数的调用上下文和返回地址

复制代码
# 示例:模拟函数调用栈
python 复制代码
def function_a():
    print("Function A called")
    function_b()
    print("Function A finished")

def function_b():
    print("Function B called")
    function_c()
    print("Function B finished")

def function_c():
    print("Function C called")

# 模拟调用栈
call_stack = []
call_stack.append("function_a")
function_a()
call_stack.pop()
print("Call stack:", call_stack)  # 输出: Call stack: []

在浏览器的前进后退功能中,堆栈用于记录用户访问的页面历史

复制代码
# 示例:使用堆栈实现浏览器的前进后退功能
python 复制代码
class BrowserHistory:
    def __init__(self):
        self.back_stack = []
        self.forward_stack = []

    def visit(self, url):
        self.back_stack.append(url)
        self.forward_stack = []  # 清空前进栈
        print(f"Visited: {url}")

    def back(self):
        if len(self.back_stack) > 1:
            self.forward_stack.append(self.back_stack.pop())
            print(f"Back to: {self.back_stack[-1]}")
        else:
            print("Cannot go back further.")

    def forward(self):
        if self.forward_stack:
            self.back_stack.append(self.forward_stack.pop())
            print(f"Forward to: {self.back_stack[-1]}")
        else:
            print("Cannot go forward further.")

# 测试
browser = BrowserHistory()
browser.visit("google.com")
browser.visit("youtube.com")
browser.visit("github.com")
browser.back()  # 输出: Back to: youtube.com
browser.back()  # 输出: Back to: google.com
browser.forward()  # 输出: Forward to: youtube.com

在人工智能领域,堆栈可以用于管理搜索路径或状态空间

复制代码
# 示例:使用堆栈实现深度优先搜索(DFS)
python 复制代码
def dfs(graph, start):
    visited = set()
    stack = [start]
    
    while stack:
        node = stack.pop()
        if node not in visited:
            print(f"Visited: {node}")
            visited.add(node)
            stack.extend(reversed(graph[node]))  # 将邻居节点逆序入栈

# 测试
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}
dfs(graph, 'A')
# 输出:
# Visited: A
# Visited: B
# Visited: D
# Visited: E
# Visited: F
# Visited: C

在游戏开发中,堆栈可以用于实现撤销操作或状态回滚功能

复制代码
# 示例:使用堆栈实现游戏状态的撤销功能
python 复制代码
class GameState:
    def __init__(self):
        self.state_stack = []

    def save_state(self, state):
        self.state_stack.append(state)
        print(f"State saved: {state}")

    def undo(self):
        if self.state_stack:
            previous_state = self.state_stack.pop()
            print(f"Undo to: {previous_state}")
        else:
            print("No states to undo.")

# 测试
game = GameState()
game.save_state("Level 1")
game.save_state("Level 2")
game.save_state("Level 3")
game.undo()  # 输出: Undo to: Level 3
game.undo()  # 输出: Undo to: Level 2
game.undo()  # 输出: Undo to: Level 1
game.undo()  # 输出: No states to undo.
相关推荐
JarvanMo3 分钟前
救救我的Android app吧
前端
EumenidesJ5 分钟前
Java常用日志框架介绍
java·log4j·logback·slf4j
南岸月明5 分钟前
为什么你拼命做副业,却还是赚不到钱?
前端
王柏龙6 分钟前
Entity Framework Core (EF Core) 中Database
数据库·microsoft
帅夫帅夫7 分钟前
你真的知道怎么用CSS吗?
前端
时序数据说10 分钟前
时序数据库IoTDB的优势场景分析
大数据·数据库·物联网·时序数据库·iotdb
蓝胖子的小叮当13 分钟前
JavaScript基础(十)对象方法总结
前端·javascript
典孝赢麻崩乐急13 分钟前
Java学习-------外观模式
java·学习·外观模式
MacroZheng21 分钟前
换掉Navicat!一款集成AI功能的数据库管理工具,功能真心强大!
java·后端·mysql
是阿建吖!23 分钟前
【Redis】初识Redis(定义、特征、使用场景)
数据库·redis·缓存