当前位置:   article > 正文

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

数据结构与算法栈和队列

1、栈的概念

2、栈的实现

3、队列的概念

4、队列的实现

5、栈与队列的OJ讲解

一、栈的概念

栈是内存中的一个部分,在程序中,我们的临时变量与函数的参数都是在栈上开辟的。栈在数据结构中属于顺序结构,在c语言的学习中我们已经了解了栈的特点的先进后出或者是后进先出,也就是说每次删除元素都是从栈顶上删除。

二、栈的实现

栈需要实现的接口函数包括:initial(初始化一个栈),destory(销毁栈),push(往栈底压入数据),pop(从栈顶删除数据),size(栈的大小),top(取栈顶的元素),isempty(判断栈是否为空)。

既然栈是一个顺序结构,那么栈就可以用单链表和顺序表实现,可到底应该取哪一种?

我们从它需要的接口函数来看,栈pop属于尾删,而单链表尾删需要找尾的前一个元素,复杂度为O(n),而顺序表只需要知道下标就可以删除尾部的元素。

所以我们选择用顺序表来实现——在栈的结构中我们可以加入一个top元素,方便尾删。

我们分三个部分来实现栈——test.c(用于测试接口函数),Stack.c(具体的函数实现),Stack.h(用于头文件的包含以及函数的声明。

下面来看栈的结构。

实际上这是和顺序表很类似的,只不过我们把顺序表中的size换成了top,其实具体的意义是一样的,只不过更加符合pop的物理结构。废话不多说,下面来实现接口函数。

1.initial——初始化函数

在未push进去元素时,我们的初识化最好把指针置空,并且把容量和size都设为0。

2.Destory——(销毁栈)

销毁栈时,我们需要把栈中的a指针free。

 

3.Push——(压栈)

压栈还是比较简单的,主要是要多一步判断,就是我们的栈是否为空或者是满。

这两种情况的栈capacity都等于top。

 

 4.Pop(从栈顶删除元素)

删除元素的时候需要判断栈是否为空,所以我们需要先实现一下判空函数。

只要栈中的top为0,就为空。

 pop函数中我们只需要把top减1即可,这样顺序表中就取不到这个元素。

接下来两个函数很简单,就不多浪费时间了。 

5.size(栈的大小)

 

 

6.top(栈顶的元素)

 三、队列的概念

 队列的特点恰好与栈相反,栈是先进后出,而队列是先进先出,也就是说每次出元素都是从队头出,它也是顺序结构中的一种。

四、队列的实现

既然队列也是顺序结构,那它也可以用顺序表或者是单链表实现,我们先来介绍一下它需要的接口函数再来考虑它到底用哪一种方式来实现!

接口函数包括:Initial(初始化队列),Destroy(销毁队列),PushQueue(入队),PopQueue(出队),QueueFront(取队头元素),IsQueueEmpty(判空),size(队长)。

接口函数都是比较容易实现的,和栈不同的是,它需要从队头删除元素,也就是说它要头删,顺序表的头删就很尴尬,复杂度是O(n),而链表只有O(1)。所以我们实现的方式选用链表。

并且我们为了方便在队尾插入元素,需要加入一个tail指针来指向尾,使得尾插复杂度达到O(1)。

我们先来看一下队列结构体。

 队列中的每个位置都是一个结点。

 下面来实现接口函数。

初始化和销毁都比较简单。

1.Initial——初始化

 2.Destory——销毁

销毁的时候需要把每一个结点都free掉,我们用cur指针来遍历链表,注意一定要用next指针记住cur指针的下一个结点,否则free掉cur以后就找不到下一个。

 

 3.Push——入队列

 如果队列是空的话,我们只要把tail和head都赋值为一个新的结点就好了。

4.Pop——出队列

还是一样,要注意队列为空的情况,我们依然先实现判空函数,当队列的头是NULL的时候就是空队列。

这里我们需要找到尾的前一个结点,然后free掉tail,再把tail赋值成我们找到的前一个结点。

5.QueueFront——取队头的元素

这里只需要return head所指向的val即可

  

6.Size——队的长度

用一个指针去遍历队列就好。

 这就是栈和队列的实现,OJ题我会放到下一个博客继续介绍!

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/975621
推荐阅读
相关标签
  

闽ICP备14008679号