【算法竞赛】栈和 stack

🔭 个人主页: 散峰而望

《C语言:从基础到进阶》《编程工具的下载和使用》《C语言刷题》《算法竞赛从入门到获奖》《人工智能》《AI Agent》
愿为出海月,不做归山云


🎬博主简介

【算法竞赛】栈和 stack

  • 前言
  • [1. 栈的概念](#1. 栈的概念)
  • [2. 栈的模拟实现](#2. 栈的模拟实现)
    • [2.1 创建](#2.1 创建)
    • [2.2 进栈](#2.2 进栈)
    • [2.3 出栈](#2.3 出栈)
    • [2.4 栈顶元素](#2.4 栈顶元素)
    • [2.6 有效元素的个数](#2.6 有效元素的个数)
    • [2.7 所有代码](#2.7 所有代码)
  • [3. stack](#3. stack)
    • 3.1创建
    • [3.2 size / empty](#3.2 size / empty)
    • [3.3 push / pop](#3.3 push / pop)
    • [3.4 top](#3.4 top)
    • [3.5 所有测试代码:](#3.5 所有测试代码:)
  • [4. 练习](#4. 练习)
  • 结语

前言

栈是算法竞赛和程序设计中最基础且重要的数据结构之一,其"后进先出"(LIFO)的特性在解决括号匹配、表达式求值、递归模拟等问题时具有天然优势。本文从栈的基本概念出发,逐步拆解其手动实现的核心操作(如进栈、出栈、栈顶访问等),并结合代码演示如何用数组模拟栈的完整功能。同时,针对 C++ STL 中的 stack 容器,详细解析其标准接口(如 push、pop、top)的使用方法,并附可直接运行的测试代码。通过对比手动实现与 STL 的差异,帮助读者深入理解栈的底层逻辑与高效应用场景。文末还提供经典习题,助力巩固栈的实际应用能力。

1. 栈的概念

栈是一种只允许在一端进行数据插入和删除操作的线性表

  • 进行数据插入或删除的一端称为栈顶 ,另一端称为栈底 。不含元素的栈称为空栈
  • 进栈就是往栈中放入元素,出栈就是将元素弹出栈顶。

栈其实是一个比较简单的数据结构。学习的重点在于用栈去解决问题,这也是难点。

栈是一种访问受限的线性表

注意:

如果定义了一个栈结构,那么添加和删除元素只能在栈顶进行。不能随意位置添加和删除元素,这是栈这个数据结构的特性,也是规定。

2. 栈的模拟实现

2.1 创建

  1. 本质还是线性表,因此可以创建一个足够大的数组,充当栈结构。
  2. 再定义一个变量 n,用来记录栈中元素的个数,同时还可以标记栈顶的位置。
cpp 复制代码
const int N = 1e6 + 10;

int n;
int stk[N]; 

2.2 进栈

还是从下标 1 的开始记录,以防一些越界问题。

cpp 复制代码
// 进栈 
void push(int x)
{
    stk[++n] = x;
}

时间复杂度:

显然是 O(1)

2.3 出栈

不用真的删除元素,只用将元素个数减 1 ,就相当于删除栈顶元素。

cpp 复制代码
// 出栈 
void pop()
{
    n--;
}

时间复杂度:

显然是 O(1)

2.4 栈顶元素

查询栈顶元素。

这里要注意,因为栈特殊的规定,不支持遍历整个栈中的元素。因此,需要查找栈中元素的时候,只能查找到栈顶元素。

cpp 复制代码
// 判空 
bool empty()
{
    return n == 0;
}

时间复杂度:

显然是 O(1)

2.6 有效元素的个数

cpp 复制代码
// 栈中元素个数 
int size()
{
    return n;
}

时间复杂度:

显然是 O(1)

2.7 所有代码

cpp 复制代码
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
// 创建栈 
int stk[N], n;
// 进栈 - 本质就是顺序表里面的尾插 
void push(int x)
{
    stk[++n] = x;
}
// 出栈 - 顺序表的尾删操作 
void pop()
{
    n--;
}
// 查询栈顶元素 
int top()
{
    return stk[n];
}
// 判断是否为空 
bool empty()
{
    return n == 0;
}
// 查询有效元素的个数 
int size()
{
    return n;
}
int main()
{
    for(int i = 1; i <= 10; i++)
    {
        push(i);
    }
    // 当栈不为空的时候 
    while(size()) // while(!empty()) 
    {
        cout << top() << endl;
        pop();
    }
    return 0;
}

3. stack

3.1创建

stack<T> st;

T 可以是任意类型的数据。

3.2 size / empty

  1. size:返回栈里实际元素的个数;
  2. empty:返回栈是否为空。

时间复杂度:

显然是 O(1)

3.3 push / pop

  1. push:进栈;
  2. pop:出栈。

时间复杂度:

显然是 O(1)

3.4 top

  1. top:返回栈顶元素,但是不会删除栈顶元素。

时间复杂度:

显然是 O(1)

3.5 所有测试代码:

cpp 复制代码
#include <iostream>
#include <stack>
using namespace std;
int main()
{
    stack<int> st;
    // 先讲 1~10 进栈 
    for(int i = 1; i <= 10; i++)
    {
        st.push(i);
    }
    while(st.size()) // !st.empty()
    {
        cout << st.top() << endl;
        st.pop();
    }
    return 0;
}        

4. 练习

  1. 有效的括号
  2. 验证栈序列

结语

栈作为一种基础数据结构,在算法竞赛中广泛应用于括号匹配、表达式求值、递归模拟等场景。通过手动模拟栈的实现,可以深入理解其底层逻辑,而标准库中的 stack 容器则能提升编码效率。

掌握栈的核心操作后,可进一步探索其与其他数据结构(如队列、优先队列)的组合应用,以应对更复杂的算法问题。

愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天

相关推荐
Mr -老鬼2 小时前
Rust 的优雅和其他语言的不同之处
java·开发语言·rust
知乎的哥廷根数学学派2 小时前
基于多尺度注意力机制融合连续小波变换与原型网络的滚动轴承小样本故障诊断方法(Pytorch)
网络·人工智能·pytorch·python·深度学习·算法·机器学习
网安CILLE2 小时前
PHP四大输出语句
linux·开发语言·python·web安全·网络安全·系统安全·php
weixin_531651812 小时前
Rust 的所有权机制
java·开发语言·rust
蚊子码农2 小时前
算法题解记录-208实现Trie前缀树
运维·服务器·算法
2301_800256112 小时前
【人工智能引论期末复习】第3章 搜索求解2 - 对抗搜索
人工智能·算法·深度优先
江公望2 小时前
QT/QML qmlRegisterType()函数浅谈
开发语言·qt
foundbug9992 小时前
MATLAB中实现信号迭代解卷积功能
开发语言·深度学习·matlab
程序猿阿伟2 小时前
《量子算法开发实战手册:Python全栈能力的落地指南》
python·算法·量子计算