首页 > 其他分享 >03专升本数据结构笔记 第三章:栈和队列

03专升本数据结构笔记 第三章:栈和队列

时间:2025-01-04 17:59:54浏览次数:3  
标签:03 return 队列 top 栈顶 int 专升本 front 数据结构

专升本数据结构笔记 第三章:栈和队列

阿洛学长笔记 love ttz

栈和队列

任务一 栈的定义、存储结构和基本操作 (阿洛学长)

一、栈的定义及其基本操作

二、栈的顺序存储结构

三、栈的链式存储结构

四、栈在递归中的应用

一、栈的定义及其基本操作

1.栈的定义

栈是一种只允许在表的一端进行插入和删除操作的线性表。 (应许表的一端进行插入和删除的线性表)
在这里插入图片描述

2.栈的基本操作

在这里插入图片描述

二、栈的顺序存储结构

1.顺序栈的结构特点

顺序栈是指采用顺序存储结构的栈,即在内存中用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时设置一个指针top指示栈顶元素的当前位置。
类型定义如下:

define MAXSIZE 100    //定义栈的最大容量

typedef struct
{
ElemType elem[MAXSIZE];    //存放栈中元素的一维数组空间
int top;            //栈顶指针变量
}SeqStack;

top用于指示某一时刻栈顶元素的位置
elem[0]用于存放栈中第一个元素
在这里插入图片描述

2.顺序栈的基本操作
(1)初始化
void InitStack (SeqStack *S)
{    //构造一个空栈S
    S -> top = 0;
}
(2)判断栈是否为空
int StackEmpty (SeqStack S)
{    //判断S是否为空栈,为空时返回TRUE,否则返回FALSE
    return (S.top == 0 ? TRUE : FALSE);
}
(3)进栈
int Push (SeqStack *S, ElemType e)
{    //将数据元素e压入栈顶
    if (S -> top == MAXSIZE)  return FALSE;//栈已满,进栈失败
    S -> elem[S -> top] = e;            //将e插入栈顶
    S -> top ++;                //修改栈顶指针
    return TRUE;
}
(4)出栈
int Pop (SeqStack *S, ElemType *e)
{    //若栈不空,将栈顶元素弹出,并用e返回其值
    if (S -> top == 0)  return FALSE;
    else
    {
        S -> top --;            //修改栈顶指针
        *e = S -> elem[S -> top];    //保存栈顶元素
        return TRUE; }
}
(5)取栈顶元素
int GetTop (SeqStack S, ElemType *e)
{    //若栈不空,则用e返回栈顶元素
    if (S.top == 0)  return FALSE;
    *e = S.elem[S.top - 1];        //保存栈顶元素
    return TRUE;
}
3.多栈共享空间

当元素进栈时,两个栈都是从两端向中间伸展。通过两个栈顶指针(top1和top2)的动态变化,使其存储空间相互补充。
在这里插入图片描述

栈满的条件是:top1=top2+1

栈空的条件是:top1=0或top2=M-1

1.两栈共享空间的数据结构定义:
define M 100            //两栈共享的存储空间大小

typedef struct
{
    ElemType Stack[M];        //两栈共享的一维数组空间
    int top[2];            //两栈的栈顶指针
}DSeqStack;
2.两栈共享空间的一些基本操作:
(1)初始化
void InitStack (DSeqStack *S)
{    //初始化两个空栈
    S -> top[0] = 0;
    S -> top[1] = M-1;
}
(2)进栈
int Push (DSeqStack *S, ElemType e, int i)
{//将数据元素e压入第i个栈的栈顶
if (S -> top[0] == S -> top[1] + 1)  return FALSE;//栈已满,进栈失败
switch (i)
{case 0 :            //将e压入第1个栈
    S -> Stack[S -> top[0]] = e;
    S -> top[0] ++;
    break;
case 1 :            //将e压入第2个栈
    S -> Stack[S -> top[1]] = e;
    S -> top[1] --;
    break;
default :            //参数错误
    return FALSE; }
    return TRUE; }
(3)出栈
int Pop (DSeqStack *S, ElemType *e, int i)
{//从第i个栈中弹出栈顶元素,并用e返回其值
switch (i)
{case 0 :                //从第1个栈弹出
    if (S -> top[0] == 0)        return FALSE;
    *e = S -> Stack[S -> top[0] - 1];
    S -> top[0] --;
    break;
case 1 :                //从第2个栈弹出
    if (S -> top[1] == M - 1)        return FALSE;
    *e = S -> Stack[S -> top[1] + 1];
    S -> top[1] ++;
    break;
default :                //参数错误
    return FALSE; }
return TRUE; } 

三、栈的链式存储结构

1.链栈的结构特点

链栈是指利用一个单链表结构来实现的栈,即栈中的每一个数据元素用一个结点来表示,同时设置一个指针top指示栈顶元素的当前位置。
在这里插入图片描述

链栈的类型定义如下:

typedef struct SNode
{
    ElemType data;            //数据域
    struct SNode *next;            //指针域
}SNode;
typedef struct
{
    struct SNode *top;            //栈顶指针
}LinkStack;
2.链栈的基本操作
(1)初始化
void InitStack (LinkStack *S)
{    //将栈S初始化为空栈
    S -> top = NULL;        //栈顶指针为空
}
(2)进栈
int Push (LinkStack *S, ElemType e)
{//将数据元素e压入链栈
LinkStack *temp;
temp = (LinkStack) malloc (sizeof (struct Node));//生成新结点
if (temp == NULL)  return FALSE;        //分配空间失败
temp -> data = e;            //为新结点数据域赋值
temp -> next = S -> top;        //将新结点插入栈顶
S -> top = temp;            //修改栈顶指针
return TRUE;
}
(3)出栈
int Pop (LinkStack *S, ElemType *e)
{    //将栈顶元素弹出,并用e返回其值
    LinkStack *temp;
    if (S -> top == NULL)     return FALSE;    //栈为空,出栈失败
    temp = S -> top;
S -> top = S -> top-> next;        //修改栈顶指针
    *e = temp -> data;        //保存栈顶元素的值
    free (temp);            //释放出栈结点
    return TRUE;
}

四、栈在递归中的应用

指一个函数在定义自身的同时又直接或间接地调用自身
在这里插入图片描述

int fib (int n)
{
A1:        if (n == 0)  return 0;
A2:        else if (n == 1)      return 1;
A3:        else  return fib (n - 1) + fib (n - 2);
A4:     } 

Fib (3)递归栈的存储空间变化情况:
在这里插入图片描述

任务二 队列的定义、存储结构和基本操作 (阿洛学长)

一、队列的定义及其基本操作

二、队列的顺序存储结构

三、队列的链式存储结构

一、队列的定义及其基本操作

1.队列的定义

队列是另一种操作受限的线性表,它只允许在表的一端进行插入操作,而在另一端进行删除操作。
在这里插入图片描述

2.队列的基本操作

在这里插入图片描述

二、队列的顺序存储结构

1.顺序队列

在内存中用一组地址连续的存储单元依次存放从队头到队尾的数据元素,同时设置两个指针front和rear分别指示队头元素和队尾元素的位置。

顺序队列的类型定义如下:

define MAXSIZE 100    //队列的最大长度

typedef struct
{
    ElemType elem[MAXSIZE];//存放队列中元素的一维数组空间
    int front;        //头指针
    int rear;        //尾指针
}SeqQueue; 

在这里插入图片描述

2.循环队列的结构特点

将队列的存储空间看成一个环状的空间,即将队列的首、尾的位置连接起来形成的结构称为循环队列。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.循环队列的基本操作
(1)初始化
void InitQueue (SeqQueue *Q)
{    //将 Q初始化为一个空的循环队列
    Q -> front = Q -> rear = 0;
}
(2)判断队列是否为空
int QueueEmpty (SeqQueue Q)
{    //判断Q是否为空队列,为空时返回TRUE,否则返回FALSE
    if (Q.front == Q.rear)    return TRUE;
    else  return FALSE;
}
(3)进队
int EnQueue (SeqQueue *Q, ElemType e)
{//将数据元素e插入到队列中
if ((Q -> rear + 1) % MAXSIZE == Q -> front)//队列已满,插入失败
return FALSE;
Q -> elem[Q -> rear] = e;        //将e插入队尾
Q -> rear =  (Q -> rear + 1) % MAXSIZE;//重新设置尾指针
return TRUE;
}
(4)出队
int DeQueue (SeqQueue *Q, ElemType *e)
{    //若队列不空,则删除Q的队头元素,并用e返回其值
    if (Q -> front == Q -> rear)    //队列空,删除失败
        return FALSE;
    *e = Q -> elem[Q -> front];    //用e返回队头元素
    Q -> front = (Q -> front + 1) % MAXSIZE;//重新设置头指针
    return TRUE;
}
(5)取队头元素
int GetFront (SeqQueue Q, ElemType *e)
{    //若队列不空,则用e返回队头元素
    if (Q.front == Q.rear)
return FALSE;
    *e = Q.elem[Q.front];        //保存队头元素
    return TRUE;
}
}

三、队列的链式存储结构

1.链队列的结构特点

采用链表形式表示的队列称为链队列,队列中每一个元素对应链表中的一个结点,并设置两个分别指示队头和队尾的指针。
在这里插入图片描述

链队列的类型定义如下:

typedef struct Node
{
    ElemType data;        //数据域
    struct Node *next;        //指针域
}LinkQueueNode;
typedef struct
{
    LinkQueueNode *front;    //队头指针
    LinkQueueNode *rear;        //队尾指针
}LinkQueue;
2.链队列的基本操作
(1)初始化
void InitQueue (LinkQueue *Q)
{//将 Q初始化为一个空的链队列
Q -> front = (LinkQueueNode *) malloc (sizeof (LinkQueueNode));
//生成头结点
if (Q -> front == NULL)  return FALSE;//存储空间分配失败
Q -> rear = Q -> front;    //队头指针和队尾指针都指向头结点
Q -> front -> next = NULL;
return TRUE;
}
(2)进队
int EnQueue (LinkQueue *Q, ElemType e)
{//将数据元素e插入到队列中
LinkQueueNode *NewNode;
NewNode = (LinkQueueNode *) malloc (sizeof (LinkQueueNode));
//生成新结点
if (NewNode == NULL)  return FALSE;//存储空间分配失败
NewNode -> data = e;        //为新结点的数据域赋值
NewNode -> next = NULL;            
Q -> rear ->next = NewNode;    //将新结点插入队尾
Q -> rear = NewNode;        //使队尾指针指向新结点
return TRUE; }
(3)出队
int DeQueue (LinkQueue *Q, ElemType *e)
{    //若队列不空,则删除Q的队头元素,并用e返回其值
    LinkQueueNode *p;
    if (Q -> front == Q -> rear)    //队列空,删除失败
        return FALSE;
    p = Q -> front -> next;        //从队头取出第一个结点
    *e = p -> data;            //用e返回结点p的值
    Q -> front -> next = p -> next;    //结点p出队
    if (Q -> rear == p)//如果队列中只有一个结点p,则p出队后成为空队列
        Q -> rear = Q -> front;
    free (p);        //释放存储空间
    return TRUE; }

标签:03,return,队列,top,栈顶,int,专升本,front,数据结构
From: https://blog.csdn.net/lxttzlove/article/details/144932992

相关文章

  • 02专升本数据结构笔记 第二章:线性表
    专升本数据结构笔记第二章:线性表阿洛学长笔记lovettz线性表任务一线性表的定义和基本操作(阿洛学长)一、线性表的定义线性表是由n(n≥0)个类型相同的数据元素a1,a2,…,an组成的有限序列,数据元素之间是一对一的关系,记作L=(a1,a2,…,ai-1,ai,ai+1,…,an)(由n(n≥0)个......
  • 【java-数据结构篇】神奇 ArrayList,一键打印扑克牌花色与点数
    我的个人主页我的专栏:Java-数据结构,希望能帮助到大家!!!点赞❤收藏❤前言:在编程的奇妙世界里,数据结构如同精巧的积木,搭建起各类功能的大厦。而ArrayList,作为其中一块极为实用的“积木”,拥有着独特的魅力与强大的功能。当我们将目光投向生活中的趣味场景——扑克牌......
  • 20241403《计算机基础与程序设计》课程总结
    20241403《计算机基础与程序设计》课程总结每周作业链接汇总第一周作业:【内容概要】课程概论第二周作业:【内容概要】①数字化②信息安全③自学教材第三周作业:【内容概要】①掌握门和电路②学习计算机部件③了解冯·诺依曼体系结构④学习C语言基础知识,第四周作业:......
  • ASE50N03-ASEMI中低压N沟道MOS管ASE50N03
    编辑:llASE50N03-ASEMI中低压N沟道MOS管ASE50N03型号:ASE50N03品牌:ASEMI封装:TO-252批号:最新最大漏源电流:50A漏源击穿电压:30VRDS(ON)Max:5.8mΩ引脚数量:3芯片个数:沟道类型:N沟道MOS管、低压MOS管漏电流:ua特性:N沟道MOS管、场效应管工作温度:-55℃~175℃备受欢迎的ASE50N03M......
  • 数据结构:包装类和泛型
    目录一、包装类1、基本数据类型和对应的包装类 2、装箱和拆箱 3、自动装箱和自动拆箱 二、泛型 1、什么是泛型2、泛型语法 3、泛型类 4、擦除机制 5、泛型的上界 6、泛型方法三、通配符 1、什么是通配符 2、通配符上界 3、通配符下界 ......
  • pat乙级1103 缘分数
    所谓缘分数是指这样一对正整数a和b,其中a和它的小弟a−1的立方差正好是另一个整数c的平方,而c正好是b和它的小弟b−1的平方和。例如83−73=169=132,而13=32+22,于是8和3就是一对缘分数。给定a所在的区间[m,n],是否存在缘分数?输入格式:输入给出区间的两个......
  • python毕设 基于微信小程序的高校学生心理互动辅导平台xyp03gda程序+论文 可用于毕业
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在快节奏与高压力的现代学习环境中,高校学生面临着前所未有的心理压力和挑战。学业负担、人际关系、职业规划等多重因素交织,使得心理健康问......
  • 01.03 CW 模拟赛 T4. ring
    前言找原题未遂了()\(\rm{HD0X}\)大佬讲了没听懂啊思路无敌了,看起来似乎很困难,不知道补不补的掉首先发现不好处理成一种简单的问题,肯定是想有哪些方法可以处理这种问题\(\rm{TJ}\)的不太看得懂你可以树状数组维护区间和,每次对于一个环暴力修改\(\mathcal{O}(s......
  • 2025-01-03 Wireshark_HTTP_v7.0 1-2节
    这是一个基于数据包的网络分析问题。以下是通过分析提供的数据包内容得出的答案:2.Whatlanguages(ifany)doesyourbrowserindicatethatitcanaccepttotheserver?该问题通常通过查看Accept-LanguageHTTP头部字段来回答,但在提供的数据包中没有看到Accept-Languag......
  • Win32汇编学习笔记03.RadAsm和补丁
    https://bpsend.net/thread-163-1-1.html补丁扫雷游戏啊下补丁在扫雷游戏中,点关闭弹出一个确认框,确认之后再关闭,取消就不关闭首先第一步就是确认关闭按钮响应的位置,一般都是WM_CLOSE的消息,消息响应一般都在过程函数,所以就是要定位到过程函数,我们知道MC项目中,......