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

news2025/1/15 5:07:35

目录

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)
"""

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.一些应用示例

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

# 示例:使用堆栈检查代码中的括号是否匹配
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

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

# 示例:模拟函数调用栈
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: []

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

# 示例:使用堆栈实现浏览器的前进后退功能
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)
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

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

# 示例:使用堆栈实现游戏状态的撤销功能
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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

USB 驱动开发 --- Gadget 驱动框架梳理(一)

本文由 Linux 内核文档翻译与总结而来,个人学习笔记仅供参考。 Gadget 框架 在 USB 协议交互过程中,角色定义: the device driver is the master (or “client driver”) Linux 内核中称为 HCD(Host Controller Driver),负责与 …

字符串算法篇——字里乾坤,算法织梦,解构字符串的艺术(下)

文章目录 前言第一章:最长公共前缀1.1 题目链接:https://leetcode.cn/problems/longest-common-prefix/description/1.2 题目分析:1.3 思路讲解:1.4 代码实现: 第二章:最长回文子串2.1 题目链接&#xff1a…

计算机网络 笔记 数据链路层3(局域网,广域网,网桥,交换机)

局域网: LAN:在某一区域内由多台计算机互联成的计算机组,使用广播信道 特点: 覆盖范围有限:通常局限在几千米范围内,比如一栋办公楼、一个校园或一个工厂等相对较小的地理区域。 数据传输速率高:一般能达到 10Mbps…

istio-proxy oom问题排查步骤

1. 查看cluster数量 cluster数量太多会导致istio-proxy占用比较大的内存,此时需检查是否dr资源的host设置有配置为* 2. 查看链路数据采样率 若采样率设置过高,在压测时需要很大的内存来维护链路数据。可以调低采样率或增大istio-proxy内存。 检查iop中…

fast-crud select下拉框 实现多选功能及下拉框数据动态获取(通过接口获取)

教程 fast-crud select示例配置需求:需求比较复杂 1. 下拉框选项需要通过后端接口获取 2. 实现多选功能 由于这个前端框架使用逻辑比较复杂我也是第一次使用,所以只记录核心问题 环境:vue3,typescript,fast-crud ,elementPlus 效果 代码 // crud.tsx文件(/.ts也行 js应…

Apache JMeter 压力测试使用说明

文章目录 一、 安装步骤步骤一 下载相关的包步骤二 安装 Jmeter步骤三 设置 Jmeter 工具语言类型为中文 二、使用工具2.1 创建测试任务步骤一 创建线程组步骤二 创建 HTTP 请求 2.2 配置 HTTP 默认参数添加 HTTP消息头管理器HTTP请求默认值 2.3 添加 查看结果监听器2.4 查看结果…

计算机网络 (40)域名系统DNS

前言 计算机网络域名系统DNS(Domain Name System)是互联网的基础技术之一,它负责将人类可读的域名转换为计算机用来通信的数字IP地址。 一、基本概念 DNS的主要目的是将域名解析或翻译为IP地址,使得用户可以通过简单易记的域名来访…

本地服务器Docker搭建个人云音乐平台Splayer并实现远程访问告别烦人广告

前言 大家好!今天我要给大家分享的是如何在Ubuntu上用Docker快速搭建高颜值无广告的某抑云音乐播放器Splayer的详细流程,并且结合cpolar内网穿透工具实现远程访问。如果你是音乐爱好者,经常需要在外办公或旅行,这个教程绝对能让你…

黑马linux入门笔记(01)初始Linux Linux基础命令 用户和权限 实用操作

B站 黑马程序员 的视频 BV1n84y1i7td 黑马程序员新版Linux零基础快速入门到精通,全涵盖linux系统知识、常用软件环境部署、Shell脚本、云平台实践、大数据集群项目实战等 增强自控力 冥想慢呼吸绿色锻炼充分休息减少决策次数优先做重要的事情(早晨)融入强自控群控…

小程序组件 —— 31 事件系统 - 事件绑定和事件对象

小程序中绑定事件和网页开发中绑定事件几乎一致,只不过在小程序不能通过 on 的方式绑定事件,也没有 click 等事件,小程序中绑定事件使用 bind 方法,click 事件也需要使用 tap 事件来进行代替,绑定事件的方式有两种&…

UE5 使用内置组件进行网格切割

UE引擎非常强大,直接内置了网格切割功能并封装为蓝图节点,这项功能在UE4中就存在,并且无需使用Chaos等模块。那么就来学习下如何使用内置组件实现网格切割。 1.配置测试用StaticMesh 对于被切割的模型,需要配置一些参数。以UE5…

ue5 1.平A,两段连击蒙太奇。鼠标点一下,就放2段动画。2,动画混合即融合,边跑边挥剑,3,动画通知,动画到某一帧,把控制权交给蓝图。就执行蓝图节点

新建文件夹 创建一个蒙太奇MA_Melee 找到c_slow 调节一下速度 把D_slow拖上去 中间加一个片段 哎呀呀,写错了,我想写2 把这个标记拖过来,点击默认default 弄第二个片段 就会自己变成这个样子 把2这个标记拖到中间 鼠标左键&a…

《机器学习》之K-means聚类

目录 一、简介 二、K-means聚类实现步骤 1、初始化数据点、确定K值 2、通过距离分配数据点 3、更新簇中心 4、 迭代更新 三、聚类效果评价方式 1、轮廓系数的定义 2、整体轮廓系数 3、使用场景 4、优点 5、缺点 6、代码实现方法 四、K-means聚类代码实现 1、API接…

Wireshark抓包教程(2024最新版个人笔记)

改内容是个人的学习笔记 Wireshark抓包教程(2024最新版)_哔哩哔哩_bilibili 该课程笔记1-16 wireshark基础 什么是抓包工具:用来抓取数据包的一个软件 wireshark的功能:用来网络故障排查;用来学习网络技术 wireshark下…

Web开发(一)HTML5

Web开发(一)HTML5 写在前面 参考黑马程序员前端Web教程做的笔记,主要是想后面自己搭建网页玩。 这部分是前端HTML5CSS3移动web视频教程的HTML5部分。主要涉及到HTML的基础语法。 HTML基础 标签定义 HTML定义 HTML(HyperText Markup Lan…

RabbitMQ 的工作模式

目录 工作模式 Simple(简单模式) Work Queue(工作队列) Publish/Subscribe(发布/订阅) Exchange(交换机) Routing(路由模式) Topics(通配…

备战蓝桥杯:树的存储与遍历(dfs和bfs)

树的概念 树的逻辑结构是树形结构,和我们之前的线性结构又不太一样了,是一种一对多的关系 树的结点分为根节点,叶子结点(没有分支的结点) 以及分支结点 从上往下看,每个结点都有0个或多个后继 从下往上…

超大规模分类(三):KNN softmax

传统的分类损失计算输入数据和每个类别中心的距离,来优化模型的训练。KNN softmax通过选择和输入数据最相关的top-K个类别,仅计算输入数据和top-K个类别中心的距离,以减小计算量。 KNN softmax首次诞生于达摩院机器智能技术实验室发表的SIGKD…

ubuntu官方软件包网站 字体设置

在https://ubuntu.pkgs.org/22.04/ubuntu-universe-amd64/xl2tpd_1.3.16-1_amd64.deb.html搜索找到需要的软件后,点击,下滑, 即可在Links和Download找到相关链接,下载即可, 但是找不到ros的安装包, 字体设…

项目实战——使用python脚本完成指定OTA或者其他功能的自动化断电上电测试

前言 在嵌入式设备的OTA场景测试和其他断电上电测试过程中,有的场景发生在夜晚或者随时可能发生,这个时候不可能24h人工盯着,需要自动化抓取串口日志处罚断电上电操作。 下面的python脚本可以实现自动抓取串口指定关键词,然后触发…