数据结构__栈和队列

本文详细介绍了栈的顺序存储结构、链式存储以及特点,包括栈的基本操作和Catalan函数的应用。同时涵盖了队列的概念、顺序与链式实现、特点及常见操作。重点讲解了循环队列和双端队列,适合深入理解线性数据结构在算法中的关键角色。
摘要由CSDN通过智能技术生成

知识框架
线性表

概念
栈: 只允许在一端进行掺入或删除操作的线性表。
栈顶: 线性表允许进行插入和删除的那一端。
栈底: 固定的、不允许进行插入和删除的另一端。
空栈: 不含任何元素的空表。
特点:先进后出

栈的基本操作
InitStack(&S):初始化一个空栈S。
StackEmpty(S):判断一个栈是否为空,若栈S为空返回true,否则返回false。
Push(&S, x):进栈,若栈S未满,将x加入使之成为新栈顶。
Pop(&S, &x):出栈,若栈S非空,弹出栈顶元素,并用x返回。
GetTop(S, &x):读栈顶元素,若栈S非空,用x返回栈顶元素。
ClearStack(&S):销毁栈,并释放栈S占用的存储空间。

栈的顺序存储结构

栈的顺序存储称为顺序栈,它是利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个**指针(top)**指示当前栈顶的位置。
栈的顺序存储类型描述:

#define MaxSize	50				//定义栈中元素最大个数
typedef	struct {
	Elemtype data[MaxSize];		//存放栈中元素
	int top;					//栈顶指针
}SqStack;

栈顶指针: S.top,初始时设置S.top = -1; 栈顶元素:S.data[S.top]。
进栈操作: 栈不满时,栈顶指针先加1,再送值到栈顶元素。
出栈操作: 栈非空时,先取栈顶元素值,再将栈顶指针减1。
栈空条件: S.top == -1;栈满条件:S.top==MaxSize - 1; 栈长:S.top+1。

栈的链式存储结构

采用链式存储的栈称为链栈,链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。通常采用单链表实现,并规定所有操作都是在单链表的表头进行的。这里规定链栈没有头结点,Lhead指向栈顶元素。
栈的链式存储类型可描述为:

typedef struct LinkNode{
	ElemType data;				//数据域
	struct Linknode *next;		//指针域
}*LiStack;						//栈类型定义

栈的出栈序列的数目: Catalan函数: 1 n + 1 C 2 n n \dfrac{1}{n+1}C_{2n}^{n} n+11C2nn

队列

队列:队列简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。
队头:允许删除的一端,又称为队首。
队尾:允许插入的一端。
特点:先进先出
队列常见的基本操作
InitQueue(&Q):初始化队列,构造一个空队列Q。
QueueEmpty(Q):判队列空,若队列Q为空返回true,否则返回false。
EnQueue(&Q, x):入队,若队列Q未满,将x加入,使之成为新的队尾。
DeQueue(&Q, &x):出队,若队列Q非空,删除队头元素,并用x返回。
GetQueue(Q, &x):读队头元素,若队列Q为空,则将队头元素赋值给x。

队列的顺序存储结构

队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针****frontrear分别指示队头元素队尾元素的位置。设队头指针指向队头元素,队尾指针指向队尾元素的下一个位置。
队列的顺序存储类型可描述为:

#define Maxsize 50				//定义队列中元素的最大个数
typedef struct {				
	ElemType data[MaxSize];		//存放队列元素
	int front, rear;			//队头指针和队尾指针
} SqQueue;

初始状态(队空条件):Q.front==Q.rear ==0。
进队操作:队不满时,先送值到队尾元素,再将队尾元素指针加1。
出队操作:队不空时,先取队头元素值,再将队头指针加1。

循环队列

当队首指针Q.front=MaxSize - 1后,再前进一个位置就自动到0。
初始时:Q.front=Q.rear=0
队首指针进1:Q.front = (Q.front + 1)%MaxSize
队尾指针进1:Q.rear = (Q.rear + 1)%MaxSize
队列长度:(Q.rear + MaxSize - Q.front)%MaxSize

牺牲一个单元来区分队空和队满,入队时少用一个队列单元。
队满条件为:(Q.rear + 1)% MaxSize == Q.front
队空条件仍为: Q.front == Q.rear
队列中元素的个数:(Q.rear - Q.front + MaxSize)% MaxSize

队列的链式存储

队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表。(队头指针指向队头结点,尾指针指向队尾结点)
队列的链式存储类型可描述为:

typedef struct {
	ElemType data;
	struct LinkNode *next;
}LinkNode;
typedef struct{
	LinkNode *front, *rear;
}LinkQueue;
双端队列

双端队列是允许两端都可以进行入队操作和出队操作的队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值