
| 🔭 个人主页: 散峰而望 |
|---|
《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 创建
- 本质还是线性表,因此可以创建一个足够大的数组,充当栈结构。
- 再定义一个变量 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
- size:返回栈里实际元素的个数;
- empty:返回栈是否为空。
时间复杂度:
显然是 O(1)
3.3 push / pop
- push:进栈;
- pop:出栈。
时间复杂度:
显然是 O(1)
3.4 top
- 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. 练习
结语
栈作为一种基础数据结构,在算法竞赛中广泛应用于括号匹配、表达式求值、递归模拟等场景。通过手动模拟栈的实现,可以深入理解其底层逻辑,而标准库中的 stack 容器则能提升编码效率。
掌握栈的核心操作后,可进一步探索其与其他数据结构(如队列、优先队列)的组合应用,以应对更复杂的算法问题。
愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天。
