栈算法篇——LIFO后进先出,数据与思想的层叠乐章(上)

news2025/1/16 7:58:45

文章目录

  • 前言
  • 第一章:栈的基础知识回顾
  • 1.1 栈的结构与实现
  • 1.2 栈的应用
  • 第二章:删除字符串中的所有相邻重复项
    • 2.1 题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/
    • 2.2 题目分析:
    • 2.3 思路讲解:
    • 2.4 代码实现:
  • 小结:栈的文学隐喻

在这里插入图片描述

前言

在计算的世界中,栈(Stack)是一种古老而又充满诗意的数据结构。它简洁、优雅,却也蕴藏着强大的力量。像一座孤独的山峰,它承载着来者的重量,却又让旅人只能按顺序前行,无法随意翻越。

栈的本质在于它的“后进先出”(LIFO, Last In First Out)原则。正如生活中许多事物,最新的往往是最先面对的,而那些久远的记忆则埋藏在更深的地方,需要层层剥开才能触及。栈便是如此,最新压入的元素总是最先被取出,而最早的那些则沉寂在底部,等待轮回的时机。

第一章:栈的基础知识回顾

1.1 栈的结构与实现

一个栈可以用数组或链表来实现,其操作如同一场无声的舞蹈。

以下是一个基于 C++ 的栈实现:

#include <iostream>
#include <vector>
#include <stdexcept>

class Stack {
private:
    std::vector<int> stack;

public:
    void push(int item) {
        stack.push_back(item);
    }

    int pop() {
        if (stack.empty()) {
            throw std::out_of_range("pop from empty stack");
        }
        int top = stack.back();
        stack.pop_back();
        return top;
    }

    int peek() const {
        if (stack.empty()) {
            throw std::out_of_range("peek from empty stack");
        }
        return stack.back();
    }

    bool isEmpty() const {
        return stack.empty();
    }
};

int main() {
    Stack stack;
    stack.push(10);
    stack.push(20);
    stack.push(30);
    std::cout << "栈顶元素: " << stack.peek() << std::endl;
    std::cout << "弹出元素: " << stack.pop() << std::endl;
    std::cout << "栈是否为空: " << (stack.isEmpty() ? "是" : "否") << std::endl;
    return 0;
}

以下是基于 C 语言的栈实现:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

void init(Stack *stack) {
    stack->top = -1;
}

bool is_empty(Stack *stack) {
    return stack->top == -1;
}

bool is_full(Stack *stack) {
    return stack->top == MAX_SIZE - 1;
}

void push(Stack *stack, int item) {
    if (is_full(stack)) {
        printf("栈已满,无法压栈\n");
        return;
    }
    stack->data[++stack->top] = item;
}

int pop(Stack *stack) {
    if (is_empty(stack)) {
        printf("栈为空,无法弹栈\n");
        exit(EXIT_FAILURE);
    }
    return stack->data[stack->top--];
}

int peek(Stack *stack) {
    if (is_empty(stack)) {
        printf("栈为空,无法查看栈顶\n");
        exit(EXIT_FAILURE);
    }
    return stack->data[stack->top];
}

int main() {
    Stack stack;
    init(&stack);
    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);
    printf("栈顶元素: %d\n", peek(&stack));
    printf("弹出元素: %d\n", pop(&stack));
    printf("栈是否为空: %s\n", is_empty(&stack) ? "是" : "否");
    return 0;
}

1.2 栈的应用

栈虽简单,却在计算机科学的广袤领域中扮演着不可或缺的角色。它如同一个忠诚的卫士,默默守护着程序的秩序。

1. 函数调用

当程序执行函数时,每一次调用都会将当前的上下文存入栈中,犹如一位旅人记录下旅途的足迹,以便归来时能够继续前行。当函数结束,记录被弹出,程序回到最初的位置。这是递归的灵魂所在,也是程序能够顺利运行的关键。

2. 表达式求值

在数学的殿堂中,栈是解析表达式的隐秘助手。无论是中缀表达式到后缀表达式的转换,还是后缀表达式的计算,栈总是穿针引线,确保每一步都井然有序。

3. 括号匹配

在编程语言的语法规则中,括号的配对如同舞蹈中的步伐,必须精准无误。栈便是这场舞蹈的裁判,记录着每一次开场与闭合,确保它们相遇时不失优雅。

以下是 C++ 实现的括号匹配示例:

#include <iostream>
#include <stack>
#include <string>

bool isValidParentheses(const std::string &s) {
    std::stack<char> stack;
    for (char c : s) {
        if (c == '(' || c == '{' || c == '[') {
            stack.push(c);
        } else {
            if (stack.empty()) return false;
            char top = stack.top();
            stack.pop();
            if ((c == ')' && top != '(') || 
                (c == '}' && top != '{') || 
                (c == ']' && top != '[')) {
                return false;
            }
        }
    }
    return stack.empty();
}

int main() {
    std::string expression = "{[()]}";
    std::cout << "括号匹配结果: " << (isValidParentheses(expression) ? "匹配" : "不匹配") << std::endl;
    return 0;
}

下面我们将结合具体题目加以分析

第二章:删除字符串中的所有相邻重复项

2.1 题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/

2.2 题目分析:

  • 给出由小写字母组成的字符串 s,删除两个相邻且相同的字母,并删除它们。

  • 在 s 上反复执行重复项删除操作,直到无法继续删除。

  • 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

2.3 思路讲解:

  • 本题极像我们玩过的「开⼼消消乐」游戏,仔细观察消除过程,可以发现本题与我们之前做过的「括
    号匹配」问题是类似的。当前元素是否被消除,需要知道上⼀个元素的信息,因此可以⽤「栈」来保
    存信息。
  • 但是,如果使⽤ stack 来保存的话,最后还需要把结果从栈中取出来。不如直接⽤「数组模拟⼀个
    栈」结构:在数组的尾部「尾插尾删」,实现栈的「进栈」和「出栈」。那么最后数组存留的内容,
    就是最后的结果。

2.4 代码实现:

class Solution {
public:
    string removeDuplicates(string s) {
        string ret;
        for(auto ch:s)
        {
            if(ret.size()&&ret.back()==ch)
            {
                ret.pop_back();
            }//删除操作
            else
            {
                ret+=ch;
            }
        }
        return ret;
    }
};

小结:栈的文学隐喻

如果把栈看作人生的隐喻,它提醒我们:最新的挑战总是最先面对,而那些曾经的经历,虽被压在时间的深处,却从未被遗忘。当我们解决了眼前的问题,回首往事时,才会发现每一步都意义深远。

栈也象征着一种简约之美。它拒绝过多的选择,只专注于当前的顶端。这种专注如同禅意,告诫我们放下多余的执念,专注于眼前的事物。

本篇关于栈算法的介绍就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!
在这里插入图片描述

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

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

相关文章

计算机的错误计算(二百一十二)

摘要 利用两个大模型计算 实验表明&#xff0c;两个大模型均进行了中肯的分析。另外&#xff0c;其中一个大模型给出了 Python代码&#xff0c;运行后&#xff0c;结果中有7位错误数字&#xff1b;而一个大模型进行加减运算时出错。 例1. 计算 下面是与一个大模型的对话…

VMware虚拟机安装Home Assistant智能家居平台并实现远程访问保姆级教程

目录 前言 1. 安装Home Assistant 前言 本文主要介绍如何在windows 10 上用VMware Workstation 17 Pro搭建 Home Assistant OS Host os version&#xff1a;Windows 10 Pro, 64-bit (Build 19045.5247) 10.0.19045 VMware version:VMware Workstation 17 Pro 1. 安装Home …

HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载,Scroll滚动到顶部

HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载 效果展示 使用方法 import LoadingText from "../components/LoadingText" import PageToRefresh from "../components/PageToRefresh" import FooterBar from "../components/…

【开源免费】基于Vue和SpringBoot的欢迪迈手机商城(附论文)

本文项目编号 T 141 &#xff0c;文末自助获取源码 \color{red}{T141&#xff0c;文末自助获取源码} T141&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

Cyber Security 101-Offensive Security-SQLMap: The Basics(sqlmap基础)

了解 SQL 注入并通过 SQLMap 工具利用此漏洞。 任务1&#xff1a;介绍 SQL 注入是一个普遍存在的漏洞&#xff0c;长期以来一直是热门 网络安全主题。要了解这个漏洞&#xff0c;我们必须首先 了解什么是数据库以及网站如何与数据库交互。 数据库是可以存储、修改和 检索。它…

【数据结构-堆】力扣1792. 最大平均通过率

一所学校里有一些班级&#xff0c;每个班级里有一些学生&#xff0c;现在每个班都会进行一场期末考试。给你一个二维数组 classes &#xff0c;其中 classes[i] [passi, totali] &#xff0c;表示你提前知道了第 i 个班级总共有 totali 个学生&#xff0c;其中只有 passi 个学…

USRP,FM解调程序

USRP&#xff0c;FM解调程序

洛谷 P1101 单词方阵刷题笔记

题目 https://www.luogu.com.cn/problem/P1101 题目要求输出包含 yizhong 所有方向排列的矩阵图 观察答案除了yizhong 均为星号 因此我们可以用bool数组来标记每个位置的状态 定义星号为无效状态 false 我们对原矩阵图 进行遍历 每当找到一个y就试一下它各个方向是否满…

WPS excel使用宏编辑器合并 Sheet工作表

使用excel自带的工具合并Sheet表&#xff0c;我们会发现需要开通WPS会员才能使用合并功能&#xff1b; 那么WPS excel如何使用宏编辑器进行合并 Sheet表呢&#xff1f; 1、首先我们要看excel后缀是 .xlsx 还是 .xls &#xff1b;如果是.xlsx 那么 我们需要修改为 .xls 注…

WPF、控件模板(ControlTemplate)和数据模板(DataTemplate)

前言 在 WPF 中&#xff0c;控件种类丰富且功能非常完善。一个显著的优点是 WPF 提供了强大的自定义能力和灵活的用户界面表现&#xff0c;能够满足各种复杂的应用需求。其中&#xff0c;ControlTemplate 和 DataTemplate 是两个非常重要的概念&#xff0c;分别用于自定义控件…

Redis十大数据类型详解

Redis&#xff08;一&#xff09; 十大数据类型 redis字符串&#xff08;String&#xff09; string是redis最基本的类型&#xff0c;一个key对应一个value string类型是二进制安全的&#xff0c;意思是redis的string可以包含任何数据。例如说是jpg图片或者序列化对象 一个re…

Python Wi-Fi密码测试工具

Python Wi-Fi测试工具 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#xff0c;点…

qml AngleDirection详解

1、概述 AngleDirection 是 QML&#xff08;Qt Meta Language&#xff09;中用于定义粒子发射方向的一个类&#xff0c;它属于 Qt Quick Particles 模块。AngleDirection 通过设置角度范围来控制粒子从发射器射出时的初始方向。这个类在创建具有特定发射模式的粒子效果时非常有…

VSCode使用纪要

1、常用快捷键 1&#xff09;注释 ctrl? 单行注释&#xff0c; altshifta 块注释&#xff0c; 个人测试&#xff0c;ctrl? 好像也能块注释 2&#xff09;开多个项目 可以先开一个新窗口&#xff0c;再新窗口打开另一个项目&#xff0c;这时就是同时打开多个项目了。 打开…

单独编译QT子模块

单独编译QT子模块 系统 win qt-everywhere-src-5.12.12 下载源码&#xff1a; https://download.qt.io/archive/qt/5.12/5.12.12/single/ 参考&#xff1a; https://doc.qt.io/qt-5/windows-building.html 安装依赖 https://doc.qt.io/qt-5/windows-requirements.html Per…

浙江安吉成新照明电器:Acrel-1000DP 分布式光伏监控系统应用探索

安科瑞吕梦怡 18706162527 摘 要&#xff1a;分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上&#xff0c;利用太阳能进行发电的一种可再生能源利用方式&#xff0c;与传统的大型集中式光伏电站相比&#xff0c;分布式光伏发电具有更灵活…

DAMA GDPA 备考笔记(二)

1. 考点分布 2. 第二章 数据处理伦理知识点总结 伦理是建立在是非观念上的行为准则。伦理准则通常侧重于公平、尊重、责任、诚信、质量、可靠性、透明度和信任等方面。数据伦理是一项社会责任问题不是法律问题。 度量指标&#xff1a;培训员工人数、合规/不合规事件、企业高管…

Unity中实现倒计时结束后干一些事情

问题描述&#xff1a;如果我们想实现在一个倒计时结束后可以执行某个方法&#xff0c;比如挑战成功或者挑战失败&#xff0c;或者其他什么的比如生成boss之类的功能&#xff0c;而且你又不想每次都把代码复制一遍&#xff0c;那么就可以用下面这种方法。 结构 实现步骤 创建一…

【Elasticsearch】filterQuery过滤查询

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

带头双向循环链表(数据结构初阶)

文章目录 双向链表链表的分类概念与结构实现双向链表定义链表结构链表打印判空申请结点初始化头插尾插头删尾删查找指定位置插入和删除销毁链表 顺序表和链表的分析结语 欢迎大家来到我的博客&#xff0c;给生活来点impetus&#xff01;&#xff01; 这一节我们学习双向链表&a…