数据结构:栈和队列

栈和队列

  • 一、栈
    • 1、定义及抽象数据类型
    • 2、顺序栈
      • (1)共享栈
    • 3、链栈
  • 二、队列
    • 1、定义及抽象数据类型
    • 2、循环队列
    • 3、链式队列
    • 4、队列扩展
  • 三、栈与队列应用

一、栈

1、定义及抽象数据类型

栈是一种操作受限的线性表。

栈(Stack)定义:只允许在一端进行插入和删除操作的线性表。
栈顶(Top):在栈顶进行插入和删除操作。
栈底(Bottom):栈底部,不允许操作。

栈的数学性质:n个不同元素进栈,出栈元素不同排列个数为:在这里插入图片描述

ADT 栈(Stack)

Data 
	除了第一个和最后一个元素,每一个元素有且只有一个前驱,有且只有一个后驱。
第一个元素没有前驱,最后一个元素没有后驱。数据元素之间的关系是一一对应的关系。
Operation
	InitStack(&S):初始化栈,建立一个空栈S
	StackEmpty(S):判断栈是否为空
	ClearStack(&S):清空栈
	DestroyStack(&S):销毁栈
	GetTop(S,&e):用e返回栈顶元素
	Push(&S,e):在栈顶插入元素e
	Pop(&S,&e):删除栈顶元素
	StackLength(S):返回栈长度
endADT

2、顺序栈

使用一段连续的空间来存储栈中元素,与顺序表相似。

(1)共享栈

为了使存储空间有效利用,提出了共享栈概念。分别从空间的两端向中间进行入栈和出栈操作,也即两个栈顶向共享空间的中间延申。

3、链栈

链栈就相当于链表,但是一般链栈没有头结点。

二、队列

1、定义及抽象数据类型

队列也是一种操作受限的线性表,队列只允许一段进一段出。

队列(Queue):一种先进先出的线性表,只允许一段插入,另一端删除。
队头(Front):允许删除的一段。
队尾(Rear):允许插入的一段。
ADT 队列(queue)

Data 
	除了第一个和最后一个元素,每一个元素有且只有一个前驱,有且只有一个后驱。
第一个元素没有前驱,最后一个元素没有后驱。数据元素之间的关系是一一对应的关系。
Operation
	InitQueue(&Q):初始化队列,建立一个空队列Q
	QueueEmpty(Q):判断队列是否为空
	ClearQueue(&Q):清空队列
	DestroyQueue(&Q):销毁队列
	GetHead(Q,&e):用e返回队头元素
	EnQueue(&Q,e):在队尾插入元素e
	DeQueue(&Q,&e):删除队头元素
	StackLength(Q):返回栈队列长度
endADT

2、循环队列

队列的顺序存储也与顺序表相似,有一段连续的存储单元来存放队列中的元素,并且有两个指针,分别为头指针和尾指针。
顺序队列有一个缺点就是存储空间是固定的,在插入和删除的操作中,队头指针不断向后移动,从而会造成假溢出,为解决此问题,提出了循环队列的概念。

	队满条件:(Q.rear+1)%MaxSize == Q.front
	队空条件:Q.front == Q.rear
	队列长度:(Q.rear-Q.front+MaxSize) %MaxSize

3、链式队列

链式队列既是带有头指针和尾指针的单链表。

4、队列扩展

双端队列
循环链式队列

三、栈与队列应用

栈:
1、表达式求解
中缀表达式和后缀表达式
2、递归调用
函数调用
3、迷宫求解
队列:
4、树的层次遍历

你可能感兴趣的:(数据结构系列,队列,栈,数据结构)