C++ 栈和队列的实现超详细解析

 更新时间:2022年03月24日 09:05:27   作者:程序猿教你打篮球  
栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解

可算是把链表给结束了,很多小伙伴已经迫不及待想看到栈和队列了,那么它来了!相信有了顺序表和链表的基础,栈和队列对于你们来讲也是轻轻松松,那我就废话不多说,直接进入今天的重点:

1、栈的介绍:

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上 插入数据的代价比较小。

本次我们是用动态数组来实现栈!静态栈在实际中一般不实用!

2、栈的常用接口实现 

 🎸 首先是我们动态栈的结构:

 有了顺序表和链表的基础我就直接上代码了!

typedef int STDataType;
 
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

🎻 栈的初始化:

 ⛳ 入栈操作:

 🎋 出栈操作:

出栈就很简单了,我们直接使top--就可以了,因为我们插入数据是先在top位置插入,然后再top++,这样我们下次插入数据就会覆盖pos位置的数据!注意:当栈没有初始化,没有数据的情况下不能进行出栈操作!

void StackPop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}

 🎁 取栈顶元素操作:

 我们知道top是栈顶元素的后一个,所以我们直接取top-1下标位置的数据就可以!

STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	return ps->a[ps->top - 1];
}

🎨  求栈的节点个数:

int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

🎠 判断栈是否为空:

 我们使用返回值为bool型的函数,bool类型只会返回true或false见下代码:

bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

 🎍 销毁栈操作:

 记得养成释放动态内存的习惯哦!

void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

 栈相对来说还是比较简单了,栈的基本接口就到这里了,下面我们来实现队列的基本接口操作!

3、队列的介绍

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾出队列,进行删除操作的一 端称为队头!

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构, 出队列在数组头上出数据,效率会比较低。

4、队列的常用接口实现 

🧦 队列的结构: 

 结构搭建这里我们就不多说了,直接走代码!

typedef int QDataType;
 
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;
 
typedef struct Queue
{
	QNode* head;
	QNode* tail;
}Queue;

🥽 队列的初始化:

这里我们只需要初始化队头指针和队尾指针就可以了! 

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
}

🎭 队尾入节点:

 👔 队头出节点:

👗  取队头节点数据:

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->head);
	
	return pq->head->data;
}

👜 取队尾节点数据:

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->head);
 
	return pq->tail->data;
}

🧨  求队列节点个数:

int QueueSize(Queue* pq)
{    
    int size = 0;
    QNode* cur = pq->head;
    assert(pq);
    while (cur)
    {
        ++size;
        cur = cur->next;
    }
    return size;
}

🎆 判断队列是否为空:

跟上面栈一样使用bool型类型

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}

🎇 销毁队列操作:

void QueueDestory(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
}

其实栈和队列这一章算简单的,如果有前面顺序表和链表的基础,这个就是轻轻松松的事,所以我只在重点的地方画了图解,没画图解的地方相信小伙伴们也是看得懂的!

gitee(码云):Mercury. (zzwlwp) - Gitee.com       

到此这篇关于C++ 栈和队列的实现超详细解析的文章就介绍到这了,更多相关C++ 栈和队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 求斐波那契(Fibonacci)数列通项的七种实现方法

    求斐波那契(Fibonacci)数列通项的七种实现方法

    本篇文章是对求斐波那契(Fibonacci)数列通项的七种实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++中map和set的简介及使用详解

    C++中map和set的简介及使用详解

    本文主要介绍了C++中map和set的简介及使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Visual studio2022 利用glfw+glad配置OpenGL环境的详细过程

    Visual studio2022 利用glfw+glad配置OpenGL环境的详细过程

    这篇文章主要介绍了Visual studio2022 利用glfw+glad配置OpenGL环境,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 基于C语言string函数的详解

    基于C语言string函数的详解

    本篇文章是对C语言中string函数进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++中map容器的具体使用

    C++中map容器的具体使用

    本文主要介绍了C++中map容器的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • C语言进阶可变参数列表

    C语言进阶可变参数列表

    这篇文章主要为大家介绍了C语言进阶可变参数列表的示例详解有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • C语言修炼之路数据类型悟正法 解析存储定风魔上篇

    C语言修炼之路数据类型悟正法 解析存储定风魔上篇

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-02-02
  • C++ 构造双向链表的实现代码

    C++ 构造双向链表的实现代码

    本篇文章是对C++中构造双向链表的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言打印某一年的日历

    C语言打印某一年的日历

    这篇文章主要为大家详细介绍了C语言打印某一年的日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C语言与C++内存管理超详细分析

    C语言与C++内存管理超详细分析

    C 语言内存管理指对系统内存的分配、创建、使用这一系列操作。在内存管理中,由于是操作系统内存,使用不当会造成毕竟麻烦的结果。本文将从系统内存的分配、创建出发,并且使用例子来举例说明内存管理不当会出现的情况及解决办法
    2022-05-05

最新评论