栈和队列是操作受限的线性表,也是两种重要的抽象数据类型。
栈:
1、栈的逻辑结构:栈 是限定仅在表尾插入和删除操作的线性表。允许插入和删除的一端成为栈顶,另一端为栈底,不含任何数据元素的栈称为空栈。(后进先出)
2、栈的顺序存储结构及实现
(1)栈的初始化:初始化一个空栈只需将栈顶指针top置为-1.
(2)入栈操作:在栈中插入一个元素X只需将栈顶指针top加1,然后在top指向的位置填入元素x。
(3)出栈操作:删除栈顶元素只需取出栈顶元素,然后将栈顶指针top-1.
(4)取栈顶元素:取栈顶元素只是将top指向的栈顶元素取出,并不修改栈顶指针。、
(5)判空操作:顺序栈的判空操作只需判断top==-1是否成立,如果成立,则栈为空,返回1;如果不成立,则栈非空,返回0.
3、栈的连接存储结构及实现
(1)构造函数:构造函数的作用是初始化一个空链栈,由于链栈不带头结点,因此只需将栈顶指针top置空。
(2)入栈操作:链栈的插入操作只需处理栈顶即第一个位置的情况,而无需考虑其他位置的情况。
(3)出栈操作:链栈的删除操作只需处理栈顶即第一个位置的情况,而无需考虑其他位置的情况。
(4)取栈顶元素:取栈顶元素只需返回栈顶指针top所指结点的数据域。
(5)判空操作:链栈的判空操作只需判断top==NULL是否成立,如果成立,则栈为空,返回1;如果不成立,则栈非空,返回0.
(6)析构函数:链栈的析构函数需要将链栈中所有的存储空间释放,算法与单链表类的析构函数类似。
4、循环队列和链队列的比较
队列
1、队列的逻辑结构:是只允许在一端进行插入操作,在另一端进行删除操作的线性表。允许插入的一端是队尾,允许删除的一端是队头。
2、队列的顺序存储结构及实现——循环队列
(1)构造函数:构造函数的作用是初始化一个空的循环队列,只需将队头指针和队尾指针同时指向数组的某一位置,一般是数组的高端,即rear=front=Queue-1.
(2)入队操作:循环队列的入队操作只需将队尾指针rear在循环意义下加1,然后将待插元素x插入队尾位置。
(3)出对操作:循环队列的出对操作只需将对头指针front在循环意义下加1,然后读取并返回队头元素。
(4)读取队头元素:读取队头元素与出对操作类似,唯一的区别是不改变队头指针。
(5)判空操作:循环队列的判空操作只需判断front==rear是否成立。如果成立,则队列为空,返回1;如果不成立,则队列非空,返回0.
3、队列的连接存储结构及实现——链队列
(1)构造函数:构造函数的作用是初始化一个空的链队列,只需申请一个头结点,然后让队头指针和队尾指针均指向头结点。
(2)入队操作:链队列的插入操作只考虑在链表的尾部进行,由于链队列带头结点,空队列和非空队列的入队操作语句一致。
(3)出对操作:链队列的删除操作只考虑在链队列的头部进行,需要注意队列长度等于1的特殊情况。
(4)取队头元素:取链队列的队头元素只需返回第一个元素节点的数据域,即返回first->next->data。
(5)判空操作:链队列的判空操作只需判断front==rear是否成立。如果成立,则队列为空,返回1;如果不成立,则队列非空,返回0.
(6)析构函数:链队列的析构函数需要将链队列中所有结点的存储空间释放,算法与单链表类的析构函数略。
4、循环队列和链队列的比较
实现循环队列和链队列的基本操作的算法都需要常数时间O(1)。循环队列和链队列的空间性能的比较与顺序栈和链栈的空间性能的比较类似,只是循环列表不能像顺序列表那样共享空间,通常不能在一个数组中存储两个循环队列。