数据结构与算法基础(三)栈和队列


数据结构与算法基础(三)a栈和队列

一、栈

在这里插入图片描述

栈和队列是两种常用重要的数据结构
栈和队列是线性表,但限定插入和删除只能在表的端点进行
栈: 后进先出(磊盘子)
队列:先进先出(食堂排队)

1.1 栈的定义和说明

栈(stack)是一个特殊的线性表,是限定仅在一端(表尾)进行删除和插入操作的线性表
后进先出 Last In First Out       LIFO结构
表尾an 称为 栈顶Top;
表头a1 称为栈底Base

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.2 栈的逻辑结构

与线性表相同,仍为一对一的关系

1.3 存储结构

用顺序栈或链栈存储均可,以顺序栈更常见 

1.4 运算规则

正能在栈顶运算,后进先出

在这里插入图片描述

二、队列

2.1 定义

队列(queue)是一种先进先出 First In First Out   FIFO 的线性表
表尾插入 表头删除

在这里插入图片描述

2.2 队列的逻辑结构

与线性表相同,仍为一对一的关系

2.3 存储结构

顺序队或链队,以循环顺序队列更为常见

2.4 运算法则

先进先出;
只能在队首或队尾运算

三、栈和队列的案例

3.1 进制转换

在这里插入图片描述
在这里插入图片描述

3.2 括号匹配检验

在这里插入图片描述

3.3表达式求值

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.4 舞伴问题

在这里插入图片描述

四、栈的表示和操作的实现

4.1 栈的抽象数据类型的类型定义

在这里插入图片描述
基本操作:
在这里插入图片描述

4.2 栈的表示和实现

由于栈本身就是线性表,于是栈也有顺序存储和链式存储两种实现方式
栈的顺序存储:顺序栈
栈的链式存储:链栈

4.2.1顺序栈的表示和实现

存储方式:
同一般线性表的顺序存储结构完全相同,用一组地址连续的存储单元依次存放 自栈底到栈顶的数据元素,栈底一般在低地址端

  • top指针,指示栈顶元素在顺序栈中的位置
  • 但为了方便操作,通常top指示真正的 栈顶元素之上的下标地址
  • base指针,指示栈底元素在顺序栈中的位置
  • stacksize 表示栈可使用的最大容量

在这里插入图片描述
但为了方便操作,通常top指示真正的 栈顶元素之上的下标地址

在这里插入图片描述

使用数组作为顺序栈存储方式的特点:
	简单、方便、但容易产生溢出(数组大小固定)
	 - 上溢(overflow) 栈已满,又要压入元素
	 - 下溢(underflow)栈已空,还要弹出元素
	 - 注:上溢是一种错误,使问题无法进行;而下溢一般认为是一种结束条件,即问题处理结束

顺序栈的表示:

#define MAXSIZE 100
typedef struct{//利用指针操作数组中的元素
	SElemType *base;//栈底指针
	SElemType *Top;//栈顶指针
	int stacksize;//栈可用最大容量
}SqStack;
利用指针操作数组中的元素,指针的差是栈中的元素个数
或利用数组的下标元素操作数据

指针指向同一个数组才能相减

4.2.1.1顺序栈的初始化

内存中开辟栈的空间,分配空间,top和base指针都指向第一个元素

Status InitStack(SqStack &S){//S是SqStack类型的由三个成员构成的结构体
	S.base=new SElemType[MAXSIZE];//或S.base=(SElemType*)malloc(MAXSIZE*sizeof(SElemType));
	if(!S.base)exit(OVERFLOW);//存储分配失败
	S.top=S.base;//栈顶指针等于栈底指针
	S.stacksize=MAXSIZE;
}
4.2.1.2顺序栈判断是否为空

栈空,top==base

Status StackEmpty(SqStack S){
	//若栈为空,返回TRUE ,否则FALSE
	if(S.top==S.base)
		return TRUE;
	else
		return FALSE;
}
4.2.1.3求顺序栈的长度
int StackLength(SqStack S){
	return S.top-S.base;
}
4.2.1.4清空顺序栈
Status ClearStack(SqStack S){//
	if(S.base) S.top=S.base;//如果栈存在
	return OK;
}
4.2.1.5销毁顺序栈

内存也不存在了

Status DestroyStack(SqStack &S){
	if(S.base){
		delete S.base;//将数组回归内存
		//将结构类型中的值设置为空
		S.stacksize=0;
		S.base=S.top=NULL;
	}
}
4.2.1.6顺序栈的入栈

在这里插入图片描述
*S.top :top指针所指的位置
后++ :先赋值在自增

4.2.1.7顺序栈的出栈

在这里插入图片描述
top指针先下移
后将top指针指向的值返回给e

4.2.2 链栈的表示和实现

嵌套定义,指针域仍是一个结构类型的
在这里插入图片描述
链栈的指针方向是与 单链表相反的

4.2.2.1链栈的初始化
void InitStack(LinkStack &S){
//构造一个空栈,头指针指向它
S=NULL;//栈顶指针置为空
return OK;
}
4.2.2.2 判断链栈是否为空
Status StackEmpty(LinkStack S)//S为空返回1
	if(S==NULL)return TRUE;
	else return FALSE;
4.2.2.3 链栈的入栈

类比单链表,有头指针L就能找到整个链表
在这里插入图片描述

4.2.2.4 链栈的出栈

只能在栈顶删除
在这里插入图片描述

4.2.2.5 取栈顶元素

头指针指向的就是栈顶元素
在这里插入图片描述

五、栈与递归

5.1 递归的定义

若一个对象部分地包含它自己
或用它自己给自己定义 则称这个对象是递归的
若一个过程直接地或间接地调用自己,则称这个过程是递归的过程

在这里插入图片描述

常用递归
1递归定义的数学函数 :阶乘、斐波那契数列
2具有递归特性的数据结构:二叉树、广义表
3可递归求解的问题:迷宫问题、汉诺塔问题
	   分治法求解:复杂的,分解为几个简单的
	   条件:1 可变为新问题
	         2 转化使问题更简单
	   	     3明确的递归出口

在这里插入图片描述

5.2 函数调用过程

在这里插入图片描述
递归,后调用的先返回
栈,后进先出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、队列的表示和操作实现

队尾插入 对头删除
在这里插入图片描述

6.1 队列的抽象数据类型定义

在这里插入图片描述

6.2 队列的顺序表示和实现

物理储存:顺序存储结构/链式存储结构
即: 顺序队列和链式队列
在这里插入图片描述
不是指针变量,用来表示数组元素中元素下标位置
在这里插入图片描述

6.2.1 解决假溢出:取模–循环队列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.2.2 如何判断为空

  • J4-6出队,只能从头部出队; front指向 4 5 (6)对5+1取模为0
  • J7-9入队,只能从尾部入队;rear指向8 9 4

在这里插入图片描述
在这里插入图片描述

6.2.3 队列的初始化

在这里插入图片描述

6.2.4 队列的长度

在这里插入图片描述
因为是循环,为了避免rear-front出现负值的情况

6.2.5 循环队列入队

在这里插入图片描述
在这里插入图片描述

6.2.6 循环队列出队

在这里插入图片描述
在这里插入图片描述

6.2.7 取队头元素

在这里插入图片描述

6.3 队列的链式表示和实现

若用户无法估计所用队列的长度,宜采用链队列
在这里插入图片描述
在这里插入图片描述

6.3.1 链队列的初始化

在这里插入图片描述

6.3.2 链队列的销毁

在这里插入图片描述
不用p改为Q.rear也可以

6.3.3 链队列的入队

在队尾入队
在这里插入图片描述

6.3.4 链队列的出队

头删
在这里插入图片描述
在这里插入图片描述

6.3.5 求链队列的队头元素

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值