《算法通关指南数据结构和算法篇(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;
}

运行结果:

总结 --- 每日励志时刻

相关推荐
君义_noip24 分钟前
信息学奥赛一本通 1661:有趣的数列 | 洛谷 P3200 [HNOI2009] 有趣的数列
c++·算法·组合数学·信息学奥赛·csp-s
leaves falling26 分钟前
C语言内存函数-
c语言·开发语言
程序员:钧念27 分钟前
深度学习与强化学习的区别
人工智能·python·深度学习·算法·transformer·rag
英英_1 小时前
MATLAB数值计算基础教程
数据结构·算法·matlab
一起养小猫2 小时前
LeetCode100天Day14-轮转数组与买卖股票最佳时机
算法·leetcode·职场和发展
至为芯2 小时前
IP6537至为芯支持双C口快充输出的45W降压SOC芯片
c语言·开发语言
hele_two2 小时前
快速幂算法
c++·python·算法
OopspoO2 小时前
C++杂记——Name Mangling
c++
yuanmenghao2 小时前
车载Linux 系统问题定位方法论与实战系列 - 车载 Linux 平台问题定位规范
linux·运维·服务器·网络·c++
小羊羊Python2 小时前
SoundMaze v1.0.1正式发布!
开发语言·c++