数据结构 -- #栈和队列的定义和基本实现

栈和队列——python 一、栈 定义一个栈 栈的应用——括号匹配问题 栈的应用——迷宫问题 二、队列 自定义队列 python队列的内置模块 队列应用——打印文件后五行 队列应用——迷宫问题 python的数据结构与算法之栈与队列 阅读详情

若没有相关知识基础,可以先看看下面文章哦🤗👇
线性表


栈和队列的基本概念

栈

栈(stack)是只允许在一端进行插入和删除操作的线性表
其最大的特性就是LIFO(last in first out) 后进先出

栈的顺序存储实现
#include<iostream>

using namespace std;

#define maxSize 10//栈的最大容量

typedef struct {
	int a[maxSize];
	int top;
}sqStack;
//初始化
void initStack(sqStack& s) {
	s.top = -1;//栈顶指针的初始化有多种,每种都要注意其栈满的条件
}
//判空
bool empty(sqStack& s) {
	if (s.top == -1)return true;
}
//入栈
bool push(sqStack& s, int x) {
	//如果maxSize为10,我们的有效存储下标为0~9
	if (s.top == maxSize - 1)return false;
	
	s.a[++s.top] = x;//栈顶指针先移动,然后元素入栈
	
	return true;
}
//出栈
bool pop(sqStack& s, int& x) {
	if (s.top == -1)return false;//栈空

	x = s.a[s.top--];//先出栈,指针再移动

	return true;
}
//得到栈顶元素
bool getTop(sqStack s, int& x) {
	if (s.top == -1)return false;
	
	x = s.a[s.top];

	return true;
}

int main() {

	return 0;
}
栈的链式存储实现(不带头结点)

由于栈是特殊的线性表,
我们可以采用头插法建立单链表的形式实现链栈
以下是不带头结点的链栈基本操作,在不带头结点的链栈中,
首结点相当于栈顶

#include<iostream>
using namespace std;

typedef struct linkStack {
	int num;
	struct linkStack* next;
}stackNode,*linkStack;

void initStack(linkStack& s) {
	s = NULL;
}
//判断是否为空
bool isEmpty(linkStack s) {
	return s == NULL;
}
//计算栈的长度
int getLen(linkStack s) {
	int length = 0;
	stackNode* temp = s;
	
	while (temp != NULL) {
		length++;
		temp = temp->next;
	}

	return length;
}
//利用单链表的头插法进行链栈的入栈操作
bool push(linkStack& s, int x) {
	stackNode* p =(stackNode*)malloc(sizeof(stackNode));
	//如果当前栈中没有结点,那么当前节点为首结点
	if (isEmpty(s)) {
		p = s;
		return true;
	}
	
	p->num = x;
	p->next = s;
	s = p;
    return true;
}

bool pop(linkStack& s, int& x) {
	if (isEmpty(s))return false;

	stackNode* p = (stackNode*)malloc(sizeof(stackNode));
	x = s->num;//返回弹出的元素
	p = s;
	s = s->next;
	free(p);//删除之前的首结点

	return true;
}

int getTop(linkStack s) {
	if (isEmpty)return -999;//代表不存在
	return s->num;
}

队列

只允许在一端插入,在另一端删除的线性表

其最大特性为先进先出(First in first out)

队列的顺序存储实现

#include <iostream>

using namespace std;

#define maxSize 10

typedef struct {
	int num[maxSize];
	int front, rear;
}sqQueue;
//初始化队列,规定头指针front==尾指针rear的时候
//为队空状态
void initQueue(sqQueue& q) {
	q.rear = q.front = 0;
}
//判断队列是否为空
bool queueEmpty(sqQueue q) {
	if (q.rear == q.front)return true;

	return false;
}
//入队
bool enQueue(sqQueue& q, int x) {
    //判断队列是否存满
	if ((q.rear + 1) % maxSize == q.front)return false;
	//在尾部插入
	q.num[q.rear] = x;
    //尾指针自增
	q.rear = (q.rear + 1) % maxSize;
	return true;
}
//出队
bool deQueue(sqQueue& q, int& x) {
    //队列如果为空则无法出队返回false
	if (queueEmpty(q))return false;
	//将出队的元素带回
	x = q.num[q.front];
    //对头指针自增
	q.front = (q.front + 1) % maxSize;
	return true;
}
//读取队头
bool getHead(sqQueue q, int& x) {
    //队列为空则返回false
	if (queueEmpty(q))return false;
	//读取队头元素
	x = q.num[q.front];
	return true;
}

​ if ((q.rear + 1) % maxSize == q.front)return false;

  • 如何判断队满?
    借助于模运算的性质,我们将存储数据的下标映射到0~maxSize-1这样的范围,形成一个环状结构(循环队列)
    由于队头指针==队尾指针已经被定义成为判断队列是否为空的条件,所以要换一种形式来定义队列是否已满。
  • 这里我们通过牺牲一个存储单元的形式来判断是否存满
    在这里插入图片描述

队列的链式存储实现(带头结点)

链式队列的特性就类似于在单链表的表头进行删除,表尾进行插入的操作

//链队每个结点的类型
typedef struct linkNode {
	int data;
	struct linkNode* next;
}linkNode;
//链队的头尾指针
//头指针相当于队头,尾指针相当于队尾
typedef struct {
	linkNode* front;
	linkNode* rear;
}linkQueue;
//初始化链队
void initQueue(linkQueue& q) {
    //初始化头尾指针
	q.front = q.rear = (linkNode*)malloc(sizeof(linkNode));
    q.front->next = NULL;
}
//判断是否为空
bool isEmpty(linkQueue q) {
	if (q.front == q.rear)return true;
	else return false;
}
//入队
void enQueue(linkQueue& q, int x) {
    //定义新结点
	linkNode* s = (linkNode*)malloc(sizeof(linkNode));
    s->data = x;
    //由于入队操作是在队尾,且当前元素入队之后一定是最后一个元素
    //所以其指向为NULL
	s->next = NULL;
    //之前的队尾指向新的队尾
	q.rear->next = s;
    //之前的队尾指针变为新的队尾
	q.rear = s;
}
//出队
bool deQueue(linkQueue& q, int& x) {
    //队空则出队失败
	if (isEmpty(q))return false;
	//让p指向出队结点,即头指针的next
	linkNode* p = q.front->next;
    //将元素记录
	x = p->data;
    //删除
	q.front->next = p->next;
    //如果被删除的元素是队列中最后一个元素
    //那么需要修改队尾指针指向
	if (q.rear == p)q.rear = q.front;
    //释放节点
	free(p);
	return true;
}
//获取队头
int getTop(linkQueue q){
	if (isEmpty(q))return -9999;//代表不存在

    return q.front->data;
}
入队图解

在这里插入图片描述
在这里插入图片描述

出队图解

在这里插入图片描述
在这里插入图片描述

总结

栈和队列都是一种操作受限的线性表,
栈只能在栈顶插入,删除。
其特点就是先进后出,类似于压子弹入匣的过程

而队列只能在队头删除,队尾删除。
其特点是先进先出。


🌻编写本篇文章目的是笔者想以输出的形式进行学习,顺便记录学习点滴🌻

🌹 如果本篇文章对你有帮助的话那就点个赞吧👍🌹

😇 本篇文章存在多处不足,如有修改意见,可以私信或者评论哦,还望海涵 😇

本篇文章部分内容来自于 王道-数据结构


MMI分束器仿真优化:用Lumerical FDTD实现95%耦合效率的实战技巧 本文详细介绍了使用Lumerical FDTD软件对MMI分束器进行仿真优化的实战技巧。通过构建高保真模型、精确配置光源与边界条件,并重点优化波导结构与taper设计,系统性地将器件的耦合效率提升至95%以上。文章还分享了利用参数扫描、varFDTD加速等高级方法,帮助硅光芯片设计工程师高效实现高性能MMI分束器设计。 阅读详情

相关推荐

Shopee前端反爬三要素:x-sap-Ri、x-sap-Sec与af-ac-enc-dat深度解析

电商前端反爬机制本质是运行时环境可信验证,其核心在于动态生成的请求指纹、会话签名与行为加密载荷。这类机制不依赖静态Token,而是基于浏览器真实交互(如鼠标轨迹、页面可见性、时间精度)实时计算,体现JS运行时环境不可模拟性。技术价值在于将风控前移至客户端,大幅提升自动化绕过成本;典型应用场景包括商品价格监控、竞品数据采集与合规爬虫开发。本文聚焦Shopee实战案例,深入拆解x-sap-Ri(设备+行为哈希指纹)、x-sap-Sec(动态密钥签名)及af-ac-enc-dat(AES加密行为载荷)三大字段的生

weixin_29015127的博客 407

数据结构与算法——栈和队列

栈和队列是两种重要的线性结构,本篇文章详细总结了数据结构与算法中栈和队列的终点知识,并且结合代码片段实现其基本操作,干货满满,每一句话都是重点,希望能给更多的小伙伴在学习数据结构与算法时带来一定帮助...

小田是个程序员的博客欢迎你的到来呀~ 2万+

红外:非均匀性校正01_基本原理与基本方法

非均匀校正(nonuniformity correction,NUC) 基本原理 这里要表达的意思就是:图中每一条直线对应一个像素点的,亮度/辐照度的情况。由于硬件的关系,每一个像素点的线性响应很不一样,所以需要通过矩阵来校正。 校正原理: 一点校正 两点校正 其他原理介绍: 参考链接: 基于多项式拟合的红外焦平面非均匀校正 课件:光电成像——非均匀性校正 红外图像非均匀性校正相关汇总 红外非均匀性校正算法总结 红外图像非均匀矫正——一点矫正 ...

dlvector的博客 2万+

常见的数据结构【栈和队列】#基础

就按照图中给的长度,假设队列长度为5,当元素E入队时,rear则应该指向5这个位置,很明显没有这个位置,那就让5%5=0,这个rear就应该指向0这个位置,也就意味着0这个位置是下一个即将入队数据所在位置。首先在不考虑空间浪费,顺序栈和链式栈的时间复杂度基本是一样的,用哪个都一样,虽然顺序栈在一开始就分配了好空间,有时会出现空间没有充分的利用,有一定的资源浪费,但我还是习惯用顺序栈,因为简单。因为在有数据的情况下,top是以0为起点,也就是date[0]就是栈底的第一个数据。所以进栈和出栈都比较简单。

m0_73406746的博客 1609

从零开始:MTK ISP调试中的ImagiqSimulator实战指南

本文详细介绍了MTK ISP调试中ImagiqSimulator的实战应用,从环境准备、参数加载到核心模块调整,提供全面的调试流程指南。重点讲解了DM模块参数优化技巧和常见问题解决方案,帮助工程师高效完成ISP调试工作,提升图像处理质量。

weixin_29168813的博客 489

2023年5月青少年软件编程Python等级考试四级真题(含答案和解析)

电子学会,2023年5月,青少年软件编程,Python等级考试,四级真题(含答案和解析)

m0_37554648的博客 904

python数据结构之栈和队列

python数据结构之栈和队列

guyanqiuqiu的博客 2459

薅“刷宝”羊毛的autojs脚本教程,简单粗暴好用!!!

本教程旨在帮助大家实现用手机或闲置手机来进行“刷宝”平台的收益,能薅多少米就看你的本事了,作者教你的是如何用autojs来进行脚本的挂机教程,掌握了这个思路后,你可以根据自己的实际需要来改进脚本或者撸别的平台:) 适用系统,**android4.0以上,苹果机暂不适用**(大多数android系统手机都是7.0以上,要查看自己手机是android几,见文件夹“视频教程-基础”>1.查看android版本的方法)

rousseaou8的博客 8万+

【数据结构#4】栈和队列?看这个就够了

这篇博客文章详细讲解了栈和队列这两种基础数据结构及其实际应用。文章首先介绍了栈的基本概念(FILO/LIFO特性)、结构操作(压栈、出栈)以及实现方式(推荐使用数组)。随后通过经典算法题(如括号匹配、表达式求值)展示栈的应用,重点讲解了中缀、前缀、后缀表达式的转换和求值方法,包括双栈法和调度场算法。 第二部分讲解了队列(FIFO特性)的实现方式(链表和数组),比较了各自的优缺点,并提供了基于链表的队列实现代码。最后通过算法题展示了如何用栈实现队列、用队列实现栈,以及循环队列的设计方法。 文章强调数据结构核心

ApolloMonasa的博客 812

STM32实战开发(128):智能位移检测 - 使用STM32实现位移检测

STM32作为一款功能强大的微控制器,由于其出色的处理能力、丰富的外设接口和低功耗特点,成为实现智能位移检测系统的理想选择。未来,可以通过结合更多传感器、多种数据处理算法以及云平台技术,进一步提升系统的智能化水平,优化位移测量的精度和稳定性。本篇博客将介绍如何使用STM32微控制器实现智能位移检测系统,涉及硬件设计、传感器选择、软件开发等多个方面,提供详细的设计步骤,并给出完整的代码示例,帮助开发者快速搭建智能位移检测系统。蜂鸣器连接到STM32的GPIO端口,当位移超过设定的阈值时,蜂鸣器发出警报。

2201_76125393的博客 901

ollama如何在自己的服务器上跑Qwen3(小白必看)

在国内下载ollama最新安装包时,使用curl -fsSL https://ollama.com/install.sh | sh命令可能会遇到网络问题导致下载进度停滞。为了解决这一问题,可以通过国内的镜像源进行下载,例如使用modelscope社区提供的最新ollama镜像仓库。具体步骤包括:首先通过pip install modelscope安装modelscope,然后使用modelscope download命令下载ollama-linux镜像,接着进入下载目录并赋予安装脚本执行权限,最后运行安装脚

Ven%的博客 757

python实现数据结构--栈和队列

使用python语言描述栈和队列

qq_56422229的博客 2615

【学习系列】SAP RAP 7:行为定义-Draft

本文介绍了RAP框架中的草稿表(Draft)功能及其应用。草稿表允许用户临时保存数据,在激活前不影响业务逻辑,支持保存继续、暂存和设备切换功能。草稿分为独占草稿(仅限同一用户编辑)和协作草稿(允许多用户协同编辑)。启用草稿需在行为定义和投影中包含标准action,并创建包含TotalETag等管理字段的草稿表。TotalETag确保草稿转换时活动数据未被修改,而ETagmaster则防止并发修改。文章通过OData调用示例详细说明了ETag验证过程,强调草稿功能由RAP框架自动处理,开发者只需关注定义和配置

DeveloperMrMeng的博客 443

十分钟手撕栈与队列——栈与队列实现详解

十分钟带你一命通关栈与队列 既然选择远方,只顾风雨兼程!

qq_61500888的博客 2971

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据结构:栈和队列

列表在尾部添加或删除元素(使用 append 和 pop)的效率也很高(O(1)),但在列表的开头插入或删除元素(如使用 insert(0, value) 或 pop(0))时,性能会显著下降,因为这涉及到移动列表中的所有其他元素,时间复杂度为 O(n),其中 n 是列表的长度。当扫描到左括号时,则将其压入栈中;使用两个栈,X 和 Y,我们把首次浏览的页面依次压入栈 X,当点击后退按钮时,再依次从栈 X 中出栈,并将出栈的数据依次放入栈 Y。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。

2301_81948543的博客 1276

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

leetcode解题 - #用栈实现队列 #用队列实现栈 #循环队列

对于此题,我们首先需要思考,该循环队列用什么实现合适; 我们先来思考能否用链表实现;必然是会用到循环链表(仅使用单链表实现循环队列是非常麻烦的,因为单链表中的结点(假设该结点存在上一结点与下一结点)只能找到下一结点,找该结点的上一结点是非常麻烦的;当然,可以使用双链表来实现,但是此处还是先考虑"简单、节约空间"的结构是否能解决此问题),循环链表中的尾结点中的next 指向头结点; (假设用单向循环链表来实现会使用到两个变量phead 与 ptail 分别指向循环队列中的头和尾) 假设题干要求循环队列有

Distinguished_z的博客 1112

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python数据结构之栈、队列和双端队列

????在上一章的学习中,我们主要学习了怎么去衡量一个算法的好坏,比较常见的方式是使用大O记法,就是所谓的时间复杂度,这一章节我来学习基本的数据结构,如栈、队列和双端队列等等。对往期章节感兴趣的小伙伴可以在下面进行查看????: ...

柳小葱的博客 2205

栈和队列的定义和实现

才能删除节点(出栈)。如果单链表很长,节点很多,效率就会非常低。

aaa114514aaaa的博客 1556

【Python 数据结构 7.栈和队列】

所谓用队列实现栈,就是要求实现一个栈,只不过这个栈的底层容器,不是顺序表,也不是链表,而是队列。所谓用栈实现队列,就是要求实现一个队列,只不过这个队列的底层容器,不是顺序表,也不是链表,而是栈。:类似出栈操作,但需将最后一个元素重新压回队列(时间复杂度O(n))。:单次出栈/查看栈顶操作最坏O(n),但均摊后仍可视为O(1)栈顶元素(即队列头部元素),均摊时间复杂度 O(1)的元素个数是否大于 1,如果大于 1,则将。的元素个数是否大于 1,如果大于 1,则将。为空,则返回true,否则返回false。

m0_73983707的博客 1337

Python数据结构之栈和队列的实现(详细无敌版!!!!)

Python数据结构容器数据结构的理解栈和栈的实现定义实现栈的简单应用队列和队列的实现定义队列的实现双端队列及其实现阻塞队列 容器数据结构的理解 在常用的数据结构中,有一批结构被称为容器,一个容器结构里总包含一组其它类型的数据对象,称为其元素,支持对这些元素的存储、管理和使用。一类容器具有相同性质,支持同一组操作,可以被定义为一个抽象的数据类型 最常用的数据容器即为:栈(stack)和队列(queue) 栈和栈的实现 定义        

但行好事,莫问前程 7743

Python数据结构与算法——数据结构(栈、队列)

使用python实现数据结构:栈、队列,以及几个经典问题:括号匹配问题、迷宫问题 还介绍python队列内置模块

qq_63043783的博客 1796

栈和队列

文章目录栈栈操作队列队列操作双端队列双端队列操作 栈 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序。 由于栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。 栈操作 // An hi

weixin_42567027的博客 4562

[LeetCode] 栈与队列 I — 232#用栈实现队列 | 225#用队列实现栈 | 20#有效的括号 | 1047#删除字符串中的所有相邻重复项

刷题笔记分享:232#用栈实现队列 | 225#用队列实现栈 | 20#有效的括号 | 1047#删除字符串中的所有相邻重复项

weixin_47226996的博客 1086

数据结构之栈和队列

栈(Stack):只允许在一端进行插入或删除的线性表栈有两个概念是:栈底和栈顶。后进先出(LIFO)。栈的基本操作InitStack(&S):初始化一个空栈S。StackEmpty(S):判断一个栈是否为空,若栈为空则返回true,否则返回false。Push(&S, x):进栈,若栈S未满,则将x加入使之成为新栈顶。Pop(&S, &x):出栈,若栈非空,则弹出栈顶元素,并用x返回。GetTop(S, &x):读栈顶元素,若栈非空则用x返回栈顶元素。

apple_51673523的博客 3107

第三章 栈和队列 栈的实现

第三章 栈和队列   大家好,我叫亓官劼(qí guān jié ),在优快云中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文原创为亓官劼,请大家支持原创,部分平台一直在盗取博主的文章!!! 博主目前仅在优快云中写博客,唯一博客更新的地址为:亓官劼的博客 3.1 栈 3.1.1 栈的定义与基本操作 栈(stack)是只允许在一端进行插入或者删除操作的线性表,是先进后出(FILO)的线性表。 栈的基本操作有: InitStack(&s); 初始化一个空栈S

一起加油 3619

后端面试必备:如何在Redis中实现队列和栈数据结构

Redis作为一款高性能的内存数据库,提供了丰富的数据结构支持,可以轻松实现队列(Queue)和栈(Stack)这两种常见的数据结构。本文将详细介绍实现方法,并辅以流程图帮助理解。

qq_58299462的博客 1331
上一篇: 数据结构 -- # 栈的应用 表达式求值 括号匹配,波兰表达式和逆波兰表达式的详解(C++)
下一篇: 蓝桥杯历届真题 -- #错误票据 (C++)
旧物有情
博客等级 码龄4年 369粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值