栈和队列——考研笔记

news/2024/12/2 22:23:57/

文章目录

  • 一.栈(Stack)基本概念
    • 1.栈的基本操作
    • 2.栈的常考题型
  • 二.顺序栈的实现
    • 1.顺序栈的定义
    • 2.增(进栈操作)
    • 3.删(出栈操作)
    • 4.共享栈(两个栈共享同一片空间)
  • 三.链栈的实现
    • 1.头插法建立单链表->对应:进栈
    • 2.单链表删除操作(出栈)
  • 四.队列(Queue)
    • 1.入队操作
    • 2.循环队列
    • 3.循环队列(出队操作)
    • 4.队列的链式实现
  • 五.双端队列
  • 六.特殊矩阵的压缩存储
    • 6.1一维数组的存储结构
    • 6.2二维数组的存储结构
    • 6.3普通矩阵的存储
    • 6.4三角矩阵的压缩存储
    • 6.5三对角矩阵的压缩存储
    • 6.6稀疏矩阵的压缩存储

一.栈(Stack)基本概念

  • 定义——“逻辑结构”
  • 基本操作——“运算”
    数据结构三要素——逻辑结构,数据的运算,存储结构(物理结构)存储结构不同,运算的实现方式也不同
    栈是仅允许在一端进行插入或删除操作的线性表

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

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

插入和删除和线性表有区别

1.栈的基本操作

在这里插入图片描述

2.栈的常考题型

在这里插入图片描述
所以有42种在这里插入图片描述

二.顺序栈的实现

在这里插入图片描述

1.顺序栈的定义

和顺序表类似

#define MaxSize 10
typedef struct{ElemType data[MaxSize];//静态数组存放栈中元素int top;//栈顶指针
}SqStack;
void testStack(){SqStack S;//声明一个顺序栈......
}

在这里插入图片描述

顺序存储,给各个数据元素分配连续的存储空间,大小为:MaxSize*sizeof(ElemType)

//初始化
void InitStack(SqStack &s){S.top=-1;//初始化栈顶指针
}
void test Stack(){SqStack S;//声明一个顺序栈(分配空间)InitStack(S);
}
//判断栈空
bool StackEmpty(SqStack S){if(S.top==-1)//栈空return true;elsereturn false;
}

在这里插入图片描述

2.增(进栈操作)

bool Push(SqStack &s,ElemType x){if(S.top==MaxSize-1)//栈满,报错return false;S.top=S.top+1;//指针先加一S.data[S.top]=x;//新元素入栈return true;
}

3.删(出栈操作)

bool Pop(SqStack &s,ElemType &x)
{if(S.top==-1)//栈空,报错return false;x=S.data(S.top);//栈顶元素先出栈S.top=S.top-1;//指针再-1return true;
}

在这里插入图片描述
读栈操作

bool GetTop(SqStack S,ElemTy0pe &x){if(S.top==-1)return false;x=S.data[S.top];//x记录栈顶元素return true;
}

注意审题top指针到底指那个位置

4.共享栈(两个栈共享同一片空间)

在这里插入图片描述

typedef struct{ElemType data[MaxSize];int top0;int top1;
}ShStack;
void InitStack(ShStack &S){S.top0=-1;S.top1=MaxSize;
}

栈满条件:top0+1==top+1
在这里插入图片描述

三.链栈的实现

  • 用链式存储方式实现的栈
  • 基本操作(增,删等)

1.头插法建立单链表->对应:进栈

在这里插入图片描述

//后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p,ElemType e){if(p==NULL)return false;LNode* s=(LNode *)malloc(sizeof(LNode));if(s==NULL)//内存分配失败return false;s->data=e;//用结点s保存数据元素es->next=p->next;p->next=s;//将结点s连接在p之后return true;
}

头插法建立单链表:
初始化单链表
while 循环
{
每次取一个数据元素e;
InsertNextNode(L,e);
}

2.单链表删除操作(出栈)

链头=栈顶在这里插入图片描述
链栈的定义

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

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

四.队列(Queue)

  • 定义
  • 基本操作
    存储结构不同,运算方式也不同
    队列:只允许在一端插入(入队),另一端删除(出队)的线性表
    在这里插入图片描述
    先进先出
  1. 队头:
  2. 队尾
  3. 空队列:队列中无任何数据元素
  4. FIFO在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
#define MaxSize 10typedef struct data[MaxSize];//静态数组存放队列元素int front,rear;//队头和队尾指针
}SqQueue;
//变量声明
vid testQueue(){SqQueue Q;
}

在这里插入图片描述

//初始化队列
void InitQueue(SqQueue &Q){//初始时,队头队尾指针指向0Q.rear=Q.front=0;
}
void testQueue(){SqQueue Q;InitQueue(Q);
}
//判断队头队尾是否为空
bool QueueEmpty(SqQueue Q){if(Q.rear==Q.front)//队空return true;elsereturn false;
}

1.入队操作

//从队尾入队
bool Insert(SqQueue &Q,ElemType x)
{if((Q.rear)+1%MaxSize==Q.front)return false;Q.data[Q.rear]=x;//x插到队尾Q.rear=(Q.rear+1%MaxSize;///环状return true;
}

2.循环队列

用模运算将存储空间在逻辑上变成“环状”
在这里插入图片描述
在这里插入图片描述

3.循环队列(出队操作)

//出队:删除一个队头元素,用x返回
bool DeQueeu(SqQueue &Q,ElemType &x)
{if(q.rear==Q.front)return false;//队空x=Q.data[Q.front];Q.front=(Q.front+1)%MaxSize;return true;
}
//查,获得头元素的值,用x返回
bool GetHead (SqQueue Q,ElemType &x){if(Q.rear==Q.front)return false;x=Q.data[Q.front];return true;
}

方案一:判断队列已满/已空
队列元素个数:(rear +MaxSize -front)%MaxSize;

在这里插入图片描述
在这里插入图片描述
方案二:判断队列已满/已空

#define MaxSize 10
typedef struct{Elemtype data[MaxSize];int front,rear;int size;//队列当前长度,插入:size++,删除:size--.初始化时rear=front=0;size=0;
}SqQueue;

在这里插入图片描述
在这里插入图片描述
方案三:判断队列已满/已空

#define MaxSize 10
typedef struct{ElemType data[MaxSize];int rear,front;int tag;//最近进行的是删除/插入
}SqQueue; 

删除:tag=0
插入:tag=1
只有删除才可能导致队空
只有插入操作才有可能导致队满
队满:front == rear && tag ==1

队空:front == rear && tag ==0
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.队列的链式实现

typedef struct LinkNode{//链式队列节点ELemType data;struct LinkNode *next;
}LinkNode;typedef struct{//链式队列LinkNode *front,*rear;//队列的队头指针和队尾指针
}LinkQueue;

在这里插入图片描述
在这里插入图片描述
链式存储实现的队列:链队列

typedef struct LinkNode{ElemType data;struct LinkNode *next;
}LinkNode;typedef struct{	LinkNode *front,*rear;
}LinkQueue;//初始化带头结点
void InitQueue(LinkQueue &L){//初始时,rear和front都指向头结点L.rear=L.front=(LinkNode*)malloc(sizeof(LinkNode));L.front->next=NULL;
}void testLinkNode(){LinkQueue Q;InitQueue(Q);
}
//判断队列是否为空
bool IsEmpty(){if(L.rear==L.front)return true;elsereturn false;
}

在这里插入图片描述

//初始化不带头结点
bool InitQueue(LinkQueue &L){L.rear=NULL;L.front=NULL;
}

在这里插入图片描述

//入队,插入节点(带头结点)
bool InsertQueue(LinkQueue &L,ElemType e){LinkNode*s=(LinkNode*)malloc(sizeof(LinkNode));s->data=e;s->next=NULL;L->rear->next=s;//新节点插入到rear之后L.rear=s;//修改表尾指针
}

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

//入队,不带头结点
bool InsertQueue(LinkQueue &L,ElemType e){LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));s->data=e;s->next=NULL;if(L.front==NULL){//在空队列中插入第一个元素L.front=s;//修改队头队尾指针L.rear=s;}else{L.rear->next=s;//新节点插入到rear之后L.rear=s;//修改rear指针}
}

在这里插入图片描述

//出队,带头结点
bool DeleteQueue(LinkQueue &L,ElemType &e)
{if(L.rear==L.front)return false;LinkNode *p=L.front->next;e=p->data;//用e返回队头元素L.front->next=p->next;//修改头结点的next指针if(L.rear==p)//最后一个结点出队L.rear=L.front;//修改rear指针free(p);//释放节点空间return true;
}

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

//出队,不带头结点
bool DeleteQueue(LinkQueue &L,ELemType &e){if(L.front==NULL)return false;LinkNode*p=L.front;//p指向此次出队的节点e=p->data;//用e返回队头元素L.front=p->next;//修改front指针if(L.rear==p){L.front=NULL;L.rear=NULL;}free(p);return true;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可加int length判断长度

五.双端队列

在这里插入图片描述
如果双端队列指从一端插入和删除,则双端队列转化为栈在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六.特殊矩阵的压缩存储

在这里插入图片描述

6.1一维数组的存储结构

ElemType a[10];//ElemType 型一维数组 ,C语言定义一维数组

  • 各数组元素大小相同,且物理上连续存放
  • 数组元素a[i]存放地址=LOC+i*sizeof(ElemType)(0<=i<10)
  • 注:除题目特别说明,否则数组下标默认从0开始
    在这里插入图片描述

6.2二维数组的存储结构

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

6.3普通矩阵的存储

在这里插入图片描述
在这里插入图片描述
压缩存储策略:只存储主对角线与上(下)三角区
用行优先原则存储到一维数组中在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.4三角矩阵的压缩存储

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

6.5三对角矩阵的压缩存储

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

6.6稀疏矩阵的压缩存储

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

在这里插入图片描述


http://www.ppmy.cn/news/1551859.html

相关文章

青少年编程等级一级 自动打包机问题

一条哈密瓜自动打包流水线的工作程序是这样的&#xff1a;首先系统设定每箱哈密瓜应该有的总重量 W&#xff1b;然后传送带将一只只哈密瓜输送到一个自动称重设备上&#xff0c;根据称重结果进行以下操作&#xff1a;- 如果称上的总重量正好达到 W&#xff0c;则将称上的所有哈…

【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 ✔️ 10.2.1 容器的类型 ✔️10.2.2 容器的名称 ✔️10.2.3 容器与模块化 CSS ✔️ 10.3…

数据库学习记录02

DQL【数据查询语言】 1.基础查询 1.1语法 select * | {[DISTINCT] column | expression[alias], ...} from table; 特点 查询列表可以是表中的字段、常量值、表达式、函数。 查询的结果是一个虚拟的表格。 #1.查询表中的单个字段 select name from employees;#2.查询表中…

网络安全之IP伪造

眼下非常多站点的涉及存在一些安全漏洞&#xff0c;黑客easy使用ip伪造、session劫持、xss攻击、session注入等手段危害站点安全。在纪录片《互联网之子》&#xff08;建议搞IT的都要看下&#xff09;中。亚伦斯沃茨&#xff08;真实人物&#xff0c;神一般的存在&#xff09;涉…

如何构建一个高效安全的图书管理系统

文章目录 技术栈功能需求实现步骤1. 准备开发环境2. 创建项目结构3. 配置数据库4. 创建实体类5. 创建仓库接口6. 创建服务类7. 创建控制器8. 创建前端页面9. 运行项目 技术栈 前端&#xff1a;HTML5、CSS3、JavaScript后端&#xff1a;Java&#xff08;Spring Boot框架&#x…

IT人日常健康工作生活方案

1. 早餐(7:00-8:00) 早餐是一天中最重要的一餐,提供充足的能量来启动新的一天。根据亚洲饮食的特点,我们加入了米饭、豆腐、蔬菜等传统食材,同时保持高蛋白、低糖的原则。 糙米粥或小米粥(1碗):低GI碳水化合物,有助于稳定血糖,提供持久能量。可加入少量的红枣、枸杞…

【Linux】gdb / cgdb 调试 + 进度条

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、Linux调试器-gdb &#x1f31f;开始使用 &#x1f320;小贴士&#xff1a; &#x1f31f;gdb指令 &#x1f320;小贴士&#xff1a; ✨watch 监视 ✨打条件断点 二、小程序----进…

JVM知识点学习-2

GC介绍之引用计数法 GC之复制算法 GC之标记压缩清除算法 标记清除算法 标记清除压缩算法&#xff1a; 优化方案&#xff1a;先标记清除几次在执行压缩过程 GC总结和鸡汤