栈和队列

来源:互联网 发布:少女与战车 知乎 编辑:程序博客网 时间:2024/06/06 03:09

1.栈Stack

1、定义
栈是限定仅在表尾进行插入或删除操作的线性表。对栈来说,表尾端称为栈顶,表头端称为栈底。不含元素的空表称为空栈。
栈的修改是按后进先出的原则进行的。因此,栈又称为后进先出的线性表。模型如下:

这里写图片描述

2、顺序栈的表示
顺序栈指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。设指针top指示栈顶元素在顺序栈中的位置,指针base指示栈底元素在顺序栈中的位置,stacksize指示栈可使用的最大容量。
空栈:S.top==S.base
满栈:S.top-S.base==S.stacksize

3、链栈的表示
链栈指利用链式存储结构实现的栈。由于栈的主要操作是在栈顶插入、删除所以直接以链表的头部作为栈顶,没必要像单链表那样为了操作方便附加一个头结点。
空栈:S==NULL;
链栈在入栈前不需要判断栈是否未满。
出栈:e=S->date;p=S;S=S->next;delete p;

2.队列Queue

1、定义
队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端称为队尾,允许删除的一端成为队头。模型如下:

这里写图片描述

2、队列的顺序表示
设两个整型变量front和rear分别指示队列头元素和尾元素,称为头指针和尾指针。初始化创建空队列时,令front=rear=0,每当插入新的队尾元素时,尾指针rear增1;每当删除队列头元素时,头指针front增1。因此,在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置。

3、循环队列
将顺序队列变为一个环状的空间,解决“假溢出”问题。当队列空间大小为m时,有m-1个元素就认为队满。当头尾指针相同时,则认为队空。即当尾指针在循环意义上加上1后等于头指针,则认为队满。
队空条件:Q.front==Q.rear
队满条件:(Q.rear+1)%MAXQSIZE==Q.front
队列长度:(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE

3、链队的表示
链队是指采用链式存储结构实现的队列。为了操作方便,给链队添加一个头结点,并令头指针始终指向头结点。
队空:Q.front==Q.rear
链队在入队前不需要判断队是否满
注意:在链队出队时,要考虑当队列中最后一个元素被删后,队尾指针也丢失了,因此要在删除最后一个元素前,对队尾指针重新赋值,即指向头指针。例:

if(Q.rear==p)    Q.rear=Q.front;//最后一个元素被删,队尾指针指向头结点delete p    //p为最后一个元素
原创粉丝点击