你还不懂栈和队列的实现吗?(图解剖析)

简介: 可算是把链表给结束了,很多小伙伴已经迫不及待想看到栈和队列了,那么它来了!相信有了顺序表和链表的基础,栈和队列对于你们来讲也是轻轻松松

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


⚽ 1、栈的介绍

🥎 2、栈的常用接口实现

🏐 3、队列的介绍

🏀 4、队列的常用接口实现

⚽  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;
}

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

相关文章
|
21小时前
|
前端开发 JavaScript 算法
JavaScript 中实现常见数据结构:栈、队列与树
JavaScript 中实现常见数据结构:栈、队列与树
|
2天前
|
存储 编译器 C语言
数据结构——顺序队列与链式队列的实现-2
数据结构——顺序队列与链式队列的实现
数据结构——顺序队列与链式队列的实现-2
|
2天前
|
存储 C语言
数据结构——顺序队列与链式队列的实现-1
数据结构——顺序队列与链式队列的实现
数据结构——顺序队列与链式队列的实现-1
|
2天前
|
存储 NoSQL C语言
数据结构——顺序栈与链式栈的实现-2
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-2
|
2天前
|
存储 C语言
数据结构——顺序栈与链式栈的实现-1
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-1
|
2天前
栈的基本应用
栈的基本应用
12 3
|
2天前
栈与队列理解
栈与队列理解
13 1
|
2天前
|
存储 算法
数据结构与算法 栈与队列
数据结构与算法 栈与队列
12 0
数据结构与算法 栈与队列
|
2天前
|
C++
数据结构(顺序队列 循环队列
数据结构(顺序队列 循环队列
10 0
|
2天前
|
C++
数据结构(共享栈
数据结构(共享栈
8 0