1.栈的定义
1.栈:只允许在一端进行插入或删除操作的线性表。
2.栈顶:允许删除或插入的一端
3.栈底:不允许删除或插入的一端
4.空栈:不含任何元素的空表
特征:先进后出(LIFO)
2.栈的基本操作
Ininstack() 初始化栈
StackEmpty() 判断栈是否为空
Push() 进栈,栈未满情况
Pop() 出栈,栈非空
GetTop() 读取栈顶元素
ClearStack() 销毁栈
3.栈的顺序存储结构
1.栈的顺序存储称为顺序栈,它是利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。
2.栈顶指针:初始时设置top = -1 栈顶元素为 stack[top]
3.进栈操作:栈不满,栈顶指针+1,再送值到栈顶元素。
4.出栈操作:栈非空时 先取栈顶元素值,再将栈顶指针减一。
5.栈空条件:top==-1 栈满条件:top = maxSize -1 ,栈长:top +1
6.共享栈:利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数据空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向空间的中间延伸。
思路:两个栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top1=maxSize时一号栈为空。当且仅当两个栈顶指针相邻(top1-top0=1)时,判断为栈满。当0号栈进栈时top0先加一再赋值,1号栈进栈时top1先减一再赋值,出栈则刚好相反。
4.栈的链式存储结构
采用链式存储的栈称为链栈,链栈的优点是便于多个栈共享存储空间和提高其效率,且不符合栈满上溢的情况。
通常采用单链表实现,并规定所有操作都是在单链表的表头进行的。这里规定链栈没有头结点,Lhead指向栈顶元素。
5.队列的定义
1.队列:一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。
2.队头:允许删除的一端,又称队首
3.队尾:允许插入的一端。
4.空队列:不含任何元素的空表。
特征:先进先出(FIFO)
6.队列的基本操作
InitQueue() 初始化队列
QueueEmpty() 判断列空,若队列Q为空返回true,否则返回false
EnQueue() 入队 队列未满
DeQueue() 出队 队列非空,删除队头元素
GetHead() 获取队头元素
7.队列的顺序存储结构
1.队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针front和rear分别指示队头元素和队尾元素的位置。
2.初始状态(队空条件):Q.front==Q.rear==0
3.进队操作:队不满时,先送值到队尾元素,再将队尾指针加1.
4.出队操作:队不空时,先取队头元素值,再将队头指针加1
顺序队列容易造成假溢出。
循环队列:将顺序队列臆造为一个环形的空间,即把存储队列元素的表从逻辑上看成一个环,称为循环队列。
1.初始时:Q.front=Q.rear=0
2.队首指针进1:Q.front=(Q.front+1)%MaxSize
3.队尾指针进1:Q.rear=(Q.rear+1)%MaxSize
4.队列长度:(Q.rear+MaxSize-Q.front)% MaxSize
5.出队入队都按顺时针方向进1
6.如何区分队空队满:
1.牺牲一个单元来区分队空和队满,入队时少用一个队列单元,约定“队头 指针在队尾指针的下一个位置作为队满的标志”
队满条件:(Q.rear+1)% maxSize==Q.front
队空条件:Q.front==Q.rear
队列中元素的个数:(Q.rear - Q.front + MaxSize)%MaxSize
2.类型中增设表示元素个数的数据成员。队空条件为:Q.size==0;队满的条件为Q.size==MaxSize.这两种情况都有Q.front==Q.rear
3.类型中增设tag数据成员,以区分是队满还是队空。tag==0,若因删除导致Q.front==Q.rear则为空,tag等于1的情况下,若因插入导致Q.front==Q.rear则为队满。
8.队列的链式存储结构
队列的链式表示链队列,他实际上是一个同时带有队头指针和队尾指针的单链表。头指针指向队头结点,尾指针指向队尾结点。
Q.front==NULL且Q.rear==NULL时,链式队列为空。
双端队列:指允许两端都可以进行入队和出队操作的队列
1.双端队列进队:前端进的元素排在后端进的元素前面,后端进的元素排列在前端进的元素后面
2.输出受限的双端队列:允许在一端进行插入和删除,但在另一端只允许插入的双端队列称为输出受限的双端队列。
3.输入受限的双端队列:允许在一端进行插入和删除,但在另一端只允许删除的双端队列称为输入受限的双端队列。