《算法通关指南数据结构和算法篇(3)--- 栈和stack》

《不一样的数据结构之--- 栈和stack》


🔥小龙报:个人主页

🎬作者简介:C++研发,嵌入式,机器人方向学习者

❄️个人专栏:《C语言》《算法》KelpBar海带Linux智慧屏项目

✨***永远相信美好的事情即将发生***

文章目录

  • 《不一样的数据结构之--- 栈和stack》
  • 前言
  • 一、栈的概念
  • 二、栈的模拟实现
    • 2.1创建
    • 2.2进栈
    • 2.3出栈
    • 2.4栈顶元素
    • 2.5判空
    • 2.6有效元素个数
    • 2.7 所有测试代码
  • 三、stack
    • 3.1 如何创建
    • 3.2容器相关接口
      • 3.2.1 size / empty
      • 3.2.2 push/pop
      • 3.2.3 top
    • 3.3测试所有接口
  • 总结 --- 每日励志时刻

前言

本系列讲解算法竞赛的数据结构在算法竞赛中,我们主要关心的其实是时间开销,空间上是基本够用的,因此我们是使用庞大的数组实现的话不多说冲!

一、栈的概念

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

(1)进行数据插入或删除的一端称为***栈顶***,另⼀端称为***栈底***。不含元素的栈称为空栈。

(2)进栈就是往栈中放入元素,出栈就是将元素弹出栈顶

ps: 栈其实是⼀个比较简单的数据结构。学习的重点在于用栈去解决问题,这也是难点。
【注意】

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

二、栈的模拟实现

2.1创建

(1)本质还是线性表,因此可以创建⼀个足够大的数组,充当栈结构

(2)再定义⼀个变量n,用来记录栈中元素的个数,同时还可以标记栈顶的位置。

c 复制代码
const int N = 1e6 + 10;
int stk[N];
int n;

2.2进栈

这里依旧舍弃下标为0 的位置,有效元素从 1开始记录

***进栈***操作,那就***把元素放在栈顶位置***即可。

不必

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

时间复杂度:O(1)

2.3出栈

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

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

时间复杂度:O(1)

2.4栈顶元素

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

c 复制代码
// 栈顶元素
int top()
{
	return stk[n];
}

时间复杂度:O(1)

2.5判空

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

时间复杂度:O(1)

2.6有效元素个数

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

时间复杂度:O(1)

2.7 所有测试代码

c 复制代码
#include <iostream>
using namespace std;

const int N = 1e6 + 10;
int stk[N];
int 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 (!empty())  // while(size()) 
	{
		cout << top() << " ";
		pop();
	}
	return 0;
}

运行结果:

三、stack

3.1 如何创建

c 复制代码
stack<T> st; 
//T 可以是任意类型的数据。

3.2容器相关接口

3.2.1 size / empty

(1)size :返回栈里实际元素的个数;

(2)empty :返回栈是否为空。
时间复杂度:O(1)

3.2.2 push/pop

(1) push :进栈;

(2) pop:出栈。
时间复杂度:O(1)

3.2.3 top

(1) top:返回栈顶元素,但是不会删除栈顶元素。
时间复杂度: O(1)

3.3测试所有接口

c 复制代码
#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;
}

运行结果:

总结 --- 每日励志时刻

相关推荐
fish_xk18 分钟前
c++中的引用和数组
开发语言·c++
有点。3 小时前
C++ ⼀级 2024 年 03 ⽉
c++
酒尘&3 小时前
JS数组不止Array!索引集合类全面解析
开发语言·前端·javascript·学习·js
冬夜戏雪3 小时前
【java学习日记】【2025.12.7】【7/60】
java·开发语言·学习
xwill*3 小时前
分词器(Tokenizer)-sentencepiece(把训练语料中的字符自动组合成一个最优的子词(subword)集合。)
开发语言·pytorch·python
CC.GG4 小时前
【C++】二叉搜索树
java·c++·redis
咖啡の猫4 小时前
Python列表的查询操作
开发语言·python
Savior`L5 小时前
二分算法及常见用法
数据结构·c++·算法
深海潜水员5 小时前
OpenGL 学习笔记 第一章:绘制一个窗口
c++·笔记·学习·图形渲染·opengl
quikai19815 小时前
python练习第三组
开发语言·python