笔记:数据结构——第三章 栈和队列

数据结构第三章(一)-栈和队列 栈和队列的应用好像也挺多的,但是我总记得C++是不是可以直接用STL来着,里面直接就有stack和queue,还可以用vector搞个动态栈。。这么一看果然C++才是最好的语言,可惜楼主学艺不精只会C。 阅读详情

第三章 栈和队列

3.1 栈

3.1.1 栈的基本概念

  • 栈(stack)是一个特殊的线性表,是限定仅在一端(通常在表尾)进行插入和删除操作的线性表;又称为后进先出(Last In First Out)的线性表,简称LIFO结构

    例如:栈s=(a1,a2,…):a1称为栈底元素,an称为栈顶元素

  • 栈顶:允许插入和删除的一端,表尾(an端)称为栈顶Top

    栈底:不允许插入和删除的一端,表头(a1端)称为栈底Base

  • 逻辑结构:一对一关系,与普通线性表相同;存储结构:顺序栈(更常见)和链栈

    数据的运算:插入元素——称为入栈进栈压栈 PUSH(x);删除元素——称为出栈弹栈 pop(y)

3.1.2 栈的顺序存储实现

*顺序栈的定义
#define MaxSize 10
typedef struct{
    ElemType data[MaxSize]		//静态指针存放栈中元素
    int top;					//栈顶指针(一般指的是数组下表)
}SqStack;						//Sq:sequence顺序

void testStack(){
    SqStack S;					//声明一个顺序栈(分配空间,其大小为MaxSize*sizeof(ElemType))
}
*栈的初始化
void InitStaack(SqStack &S){
    S.top=-1;					//初始化栈顶指针
}

//判断栈空
bool StackEmpty(SqStack S){
    if(S.top==-1)
        return true;
    else
        return false;
}
*进栈操作
bool Push(SqStack &S,EleemType x){
    if(S.top==MaxSize-1)
        return false;
    S.top=S.top+1;				//此处两句等价于:S.data[++S.top]=x——先加再运算
    S.data[S.top]=x;			//先加1指向下一个,再使用top值入栈
    return ture;
}
*出栈操作
bool Pop(SqStack &S,ElemType &x){
     if(S.top==-1)
        return false;
    x=S.data[S.top];			//等价于:S.data[S.top--]=x——先运算再减
    S.top=S.top-1;
    return ture;
}
  • 数据还残留在内存中,只是逻辑上被删除了
*读栈顶元素
bool GetTop(SqStack &S,EleemType &x){
    if(S.top==-1)
        return false;
    x=S.data[S.top];			
    return ture;
}
*另一种方式
  • 初始时,栈顶指针指向0:S.top==0;
//进栈
S.data[S.top]=x;				//等价于:S.data[S.top++]=x
S.top=S.top+1;
//出栈
S.top=S.top-1;					//等价于:S.data[--S.top]=x
x=S.data[S.top];
  • 栈满的条件:top==MaxSize
*共享栈
#define MaxSize 10
typedef struct{
    ElemType data[MaxSize];
    int top0;					//0号栈顶指针,栈底-1开始
    int top1;					//1号栈顶指针,栈顶MaxSize开始
}ShStack;

//共享栈的初始化
void InitStack(ShStack &S){
    S.top0=-1;
    S.top1=MaxSize;
}
  • 两个栈共享一片空间,逻辑上实现了两个栈,物理上只使用了一片存储空间
  • 栈满的条件:top0+1==top1

3.1.3 栈的链式存储方式

  • 链栈的基本操作:类似于单链表的头插法和对头结点的删除操作
*链栈的定义
  • 和单链表类似,但一般推荐不带头结点的链栈
typedef struct Linknde{
    ElemType data;
    struct Linknode *next;
}*LiStack;

3.2 队列

3.2.1 队列的基本概念

  • 队列(Queue)是只允许在一端进行插入,在另一端删除的线性表;又称为先进先出(FIFO)的线性表

  • 队头:允许删除的一端;队尾:允许插入的一端

3.2.2 队列的顺序实现

*顺序队列的定义
#define MaxSize 10
typedef struct{
    ElemType data[MaxSize];				//用静态数组存放队列元素		
    int front;							//队头指针:指向队头元素
    int rear;							//队尾指针:指向队尾元素的后一个位置(下一个应该插入的位置)
}SqQueue;	
*顺序队列的初始化
#define MaxSize 10
typedef struct{
    ElemType data[MaxSize];				
    int front;					
    int rear;					
}SqQueue;	

void InitQueue(SqQueue &Q){
    Q.front=Q.rear=0;					//0既是队头位置,也是下一个插入的位置
    return OK;
}

//判断队列是否为空
bool QueueEmpty(SqQueue Q){
    if(Q.front==Q.rear)
        return true;
    else
        return false;
}
*循环队列——入队操作
  • 队列元素个数——(rear-front+MaxSize)%MaxSize;

  • 队空——队尾和队头指针指向同一位置front==rear;

    队满——队尾指针的下一位置是队头(rear+1)%MAXQSIZE==front;

bool EnQueue(SqQueue &Q,ElemType x){
    if((Q.rear+1)%MAXQSIZE==Q.front)		//判断队满
        return false;
    Q.data[Q.rear]=x;
    Q.rear=(Q.rear+1)%MaxQSize;				//队尾指针后移,指针加1取模
    return true;
}
  • 模运算:即取余运算,a%b==a除以b的余数,也表示为a MOD b
*循环队列——出队操作
bool DeQueue(SqQueue &Q,ElemType &x){
    if(Q.rear==Q.front)						//判断队空
        return false;
    x=Q.data[Q.front];
    Q.front=(Q.f+1)%MaxQSize;				//队头指针后移
    return true;
}

//获得队头元素(只删除后移的代码)
bool GetQueue(SqQueue &Q,ElemType &x){
    if(Q.rear==Q.front)	
        return false;
    x=Q.data[Q.front];
    return true;
}
*判断队列已满/已空
  • 方案一:牺牲一个存储空间:

    队列元素个数——(rear-front+MaxSize)%MaxSize;

    队空——front==rear;队满——(rear+1)%MAXQSIZE==front;

  • 方案二:不牺牲存储空间(设置size)

#define MaxSize 10
typedef struct{
    ElemType data[MaxSize];					
    int front;					
    int rear;
    int size;							//设置一个计数size
}SqQueue;	
  • 初始化:rear=front=0; size=0;插入成功:size++;删除成功:size--;

    队满条件:size==MaxSize;队空条件size=0;

  • 方案三:不牺牲存储空间(设置tag)

#define MaxSize 10
typedef struct{
    ElemType data[MaxSize];					
    int front;					
    int rear;
    int tag;							//设置一个计数tag
}SqQueue;	
  • 初始化:rear=front=0; tag=0;插入成功:tag=1(入队);删除成功:tag=0(出队);

    队满条件:front==rear&&tag==1;队空条件tag=0

*其他出题方法(队尾)
  • 队尾指针指向队尾元素的位置:初始时:Q.rear=-1;
//入队操作(颠倒顺序)
  Q.data[Q.rear]=x;
  Q.rear=(Q.rear+1)%MaxQSize;		

//出队操作
  x=Q.data[Q.front];
  Q.front=(Q.f+1)%MaxQSize;	

//判空
  (Q.rear+1)%MAXQSIZE==Q.front;			//头指针在尾指针的后一个位置(类似循环)

//判满(方案一:牺牲一格存储单位)
  (Q.rear+2)%MAXQSIZE==Q.front;			//头指针在尾指针的后两个位置
//判满方案二:增加辅助变量

3.2.3 队列的链式实现

*链式队列的定义
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 &Q){
    Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));		//初始时,头尾指针都指向头结点
    Q.front->next=NULL;
}

//判断队列是否为空
bool IsEmpty(LinkQueue){
    if(Q.front==Q.rear)
        return true;
    else
        return false;
}

void testLinkQueue(){
    LinkQueue();						//声明一个队列
    InitQueue(Q)						//初始化队列
    //...后续操作...
}
*链式队列的初始化(不带头结点)
void InitQueue(LinkQueue &Q){
    Q.front=NULL;						//初始时,头尾指针都指向NULL
    Q.rear=NULL;
}

bool IsEmpty(LinkQueue){
    if(Q.front==NULL)			
        return true;
    else
        return false;
}
*链式队列——入队(带头结点)
void EnQueue(LinkQueue &Q,ElemType x){
    LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
    s->data=x;
    s->next->NULL;
    Q.rear->next=s;
    Q.rear=s;
}
*链式队列——入队(不带头结点)
void EnQueue(LinkQueue &Q,ElemType x){
    LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
    s->data=x;
    s->next->NULL;
    if(Q.front==NULL){					//在空队列中插入第一个元素
        Q.front=s;
        Q.rear=s;
    }else{
        Q.rear->next=s;
   		Q.rear=s;
    }
}
*链式队列——出队(带头结点)
bool DeQueue(LinkQueue &Q,ElemType &x){
    if(Q.front==Q.rear)
        return false;
    LinkNode *p=Q.front->next;			//出队为头指针的下一个结点
    x=p->data;
    Q.front->next=p->next;
    if(Q.rear==p)						//此次是最后一个结点出队
        Q.rear=Q.front;					//头尾指针均指向头结点,为空状态
    free(p);
    return true;
}
*链式队列——出队(不带头结点)
bool DeQueue(LinkQueue &Q,ElemType &x){
    if(Q.front==NULL)
        return false;
    LinkNode *p=Q.front;				//出队为头指针结点
    x=p->data;
    Q.front=p->next;
    if(Q.rear==p){						//此次是最后一个结点出队
        Q.rear=NULL;
    	Q.front=NULL;
    }
    free(p);
    return true;
}
  • 队列满的情况:顺序存储——预分配的空间耗尽时队满;链式存储——一般不会满队,除非内存不足

3.2.4 双端队列

  • 双端队列:只允许从两端插入、两端删除的线性表

    输入受限的双端队列:只允许从一端插入、两端删除的线性表;输出受限的双端队列:只允许从两端插入、一端删除的线性表

  • 考点:判断输出序列的000合法性——考特兰数:C n(上) 2 n(下) /(n+1)

3.3 栈的运用

3.3.1 栈在括号匹配中的应用

  • IDE :可视化编程环境

  • 栈的特性——最后出现的左括号最先被匹配

    遇到左括号:入栈;遇到右括号:出栈“消耗”一个左括号

#define MaxSize 10
typedef struct{
    char data[MaxSize];
    int top;							//栈顶指针
}

bool bracketCheck(char str[],int length){
    SqStack S;							//定义一个栈
    InitStack(S);						//初始化一个栈
    for(i=0;i<length;i++){				//下标从0开始
        if(str[i]=='('||str[i]=='{'||str[i]=='['){
            Push(S,str[i]);				//入栈左括号
        }else{
            if(EmptyStack(S))
                return false;
            char topElem;
            Pop(S,topElem);				//出栈左括号;依次判断不匹配的可能
            if(str[i]==')'&&topElem!='(')
                return false;
            if(str[i]=='}'&&topElem!='{')
                return false;
            if(str[i]==']'&&topElem!='[')
                return false;
        }
    }
    return StackEmpty(S);				//检索完后,栈空才说明成功
}
  • 匹配失败的情况:左右括号不匹配;左右括号单身

3.3.2 栈在表达式求值中的应用

  • 算数表达式的三个组成部分:操作数、运算符、界限

    例子:a+b-c*d(先算a加b,再算c乘d,再算减法)

  • 中缀表达式:a+b-c*d;后缀表达式:ab+cd *-;前缀表达式:- +ab * cd

    后缀表达式(逆波兰表达式)——运算符在两个操作数后面

    前缀表达式(波兰表达式)——运算符在两个操作数前面

*中缀表达式转前缀表达式
  • 手算:运算符和两个操作数组合成为一个新的操作数,再参与下次运算

    “右优先”原则:只要右边的运算符能先计算,就优先算右边的;让前缀表达式的运算符从右到左依次生效

*前缀表达式的计算
  • 手算:从右开始,第一个运算符及其右边两个操作数开始运算
  • 机算:
    1. 从右往左依次扫描元素
    2. 遇到操作数:直接压入栈
    3. 遇到运算符:弹出两个栈顶元素,执行相应运算,结果压回栈顶
  • 注意:先弹出栈的是“左操作数”;除法和减法部分需要注意
*中缀表达式转后缀表达式
  • 手算:两个操作数和运算符组合成为一个新的操作数,再参与下次运算

    “左优先”原则:只要左边的运算符能先计算,就优先算左边的,可保证运算顺序一致

  • 机算:

    初始化一个栈,用于保存还不能确定运算顺序的运算符

    从左到右依次扫描各个元素,直到末尾(多种方法)

    1. 遇到操作数:直接加入后缀表达式
    2. 遇到界限符:遇到“(”直接入栈;遇到“)”依次弹出栈内运算符,并加入后缀表达式,直到遇到“(”
    3. 遇到运算符:依次弹出栈中优先级高于等于当前运算符的所有运算符,并加入后缀表达式,若遇到“(”或栈空则停止。之后再把当前运算符入栈
    4. 上述处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式
  • 注意:后缀表达式中没有左右括号

*后缀表达式的计算
  • 手算:从左开始,第一个运算符及其左边两个操作数开始运算
  • 机算:
    1. 从左往右依次扫描元素
    2. 遇到操作数:直接压入栈
    3. 遇到运算符:弹出两个栈顶元素,执行相应运算,结果压回栈顶
  • 注意:先弹出栈的是“右操作数”
*中缀表达式的计算
  • 中缀表达式计算:中缀转后缀+后缀表达式求值

  • 初始化两个栈——操作数栈和运算符栈

    1. 遇到操作数:压入操作栈
    2. 遇到运算符或界限符:按照“中缀转后缀”压入运算符栈;期间每弹出运算符,就需要再弹出两个数运算,再压回操作数栈
    3. 最后的运算结果在操作数栈顶

3.3.3 栈在递归中的应用

  • 函数调用的特点:最后被调用的函数最先执行(LIFO)

    函数调用时,需要用一个栈(函数调用栈)存储——调用返回地址、实参、局部变量

  • 适合用“递归”算法解决的特点:可以把问题转为属性相同,但规模较小的问题

    递归调用时,函数调用栈可称为“递归工作栈”;每进入一层递归,就将递归调用所需信息压入栈顶;每退出一层递归,就从栈顶弹出相应信息;

    (进入:return到下一个要计算的函数;退出:return到上一个函数的结果)

*递归算法求阶乘
int factorial(int i){
    if(n==0||n==1)
        return 1;					//当n减到1时,返回1到factorial(1+1)函数中算(1+1)*fac(1)
    else
        return n*factorial(n-1);	//先递减进入函数,再递加计算每一层函数
}

int main(){
    //...其他代码
    int x=factorial(10);
}
  • 缺点:太多层递归会导致栈溢出,空间复杂度太高;可能包含很多重复运算

    可以自定义栈将递归算法改造成非递归算法

3.3.4 队列的应用

  • 队列应用——树的层次遍历、图的广度优先遍历

  • 队列在操作系统中的应用——CPU:先来先服务(FCFS)

3.4 特殊矩阵的压缩存储

  • 数组的存储结构:一维数组、二维数组

    特殊矩阵:对称矩阵、三角矩阵、三对角矩阵、稀疏矩阵

  • 注意:除非特殊说明,否则数组下标默认从0开始

  1. 二维数组:b[2] [4]表示2行4列的数组
  2. 普通矩阵:可用二维数组存储;注意描述矩阵元素时通常从1开始,数组从0开始
  3. 对称矩阵:存储位置行数和列数相等,关于对角线对称;下三角区(i>j)\上三角区(i<j),计算时可用只存储主对角线+上(下)对角线;按行优先原则
  4. 三角矩阵:存储在主对角线和上(下)三角区,其余元素都为常量c;计算时按行优先原则与对称矩阵相似,并在最后一个位置存储常量c
  5. 三对角矩阵:行号和列号绝对值差大于1,其余为0;按行优先原则,只有头尾存储2个元素,其余为3个元素;计算时先求行号,列号最多与行号差1
  6. 稀疏矩阵:顺序存储——三元组<行,列,值>;链式存储——十字链表法<行,列,值><指向同列下一元素,指向同行下一元素>;包含向右域right和向下域down分别指向对应行列的第一个元素
从硬件到软件:TSMaster报文过滤全链路配置指南(含同星设备适配) 本文详细介绍了TSMaster平台下CAN/LIN/FlexRay总线的报文过滤全链路配置指南,特别针对同星TC1016等硬件的兼容性进行实战演示。从硬件层预过滤到软件层可编程过滤,提供五维过滤体系构建方法,帮助工程师提升车载诊断与总线分析效率。重点解析混合总线过滤策略优化及诊断场景下的特殊过滤方案。 阅读详情

相关推荐

电源完整性之Cadence Sigrity Power SI_AC阻抗仿真

之前和大家分享过电源完整性之仿真设计原理链接: [link](https://blog.youkuaiyun.com/weixin_41808082/article/details/117065140?spm=1001.2014.3001.5501).今天接着上一篇文章总结一下电源AC阻抗的的仿真操作流程及一些simulation中的设置参数,用到的时候Cadence Sigrity 中的Power SI组件,下面开始享受仿真的快乐吧: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的Power SI

刘小同学的博客 1万+

数据结构笔记(其三)--栈与队列

对栈与队列的讲解

sjj_1234567的博客 244

Fiddler Everywhere保姆级教程:10分钟搞定手机HTTPS抓包(附证书配置避坑指南)

本文提供Fiddler Everywhere移动端HTTPS抓包的保姆级教程,涵盖环境配置、代理设置、证书安装及常见问题排查。重点解析如何正确安装并信任Fiddler根证书以解密HTTPS流量,帮助开发者快速搭建抓包环境,高效分析应用网络行为,提升调试效率。

git9versioner的博客 705

数据结构第三章栈和队列笔记

个人数据结构第三章栈和队列的笔记

m0_71069189的博客 448

从零到一:基于GeneMark-ES/ET的新基因组注释实战指南

本文提供了一份基于GeneMark-ES/ET的新基因组注释实战指南。详细介绍了从环境搭建、数据准备到核心运行的全流程,重点解析了ES(从头预测)与ET(结合RNA-Seq证据)两种模式的选择与操作,并分享了Perl模块依赖、并行处理等常见问题的解决方案,帮助生物信息学研究者高效完成基因预测工作。

weixin_29266647的博客 209

谁还攥着旧的类加载器:Metaspace OOM 的元数据记账、类卸载条件与泄漏定位解析

MetaSpace区是JVM内存管理中的关键部分,负责存储类元数据。随着Java 8的推出,MetaSpace取代了PermGen区,但其灵活性也带来了新的挑战,尤其是在动态类加载和频繁类更新的场景下,容易导致MetaSpace内存溢出(OOM)问题。本文探讨了MetaSpace OOM的根本原因,包括类加载器泄漏、内存管理不当和GC效率低下等,并提供了一系列调优策略和解决方案,帮助开发者有效排查和防止此类问题的发生,确保应用程序的稳定性和高可用性。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

数据结构学习笔记(Ⅲ):栈和队列

数据结构

m0_49939117的博客 597

3、提升管壳式换热器能效:双螺旋盘管的应用研究

本研究探讨了在管壳式热交换器中应用双螺旋盘管以提升能效的可行性。通过实验对比双螺旋与单螺旋盘管的热传递效率,结果显示双螺旋盘管达到54.33%的效率,显著优于单螺旋的48.88%。双螺旋结构不仅增大了换热面积,还因产生剪切应力而减少结垢,延长运行周期。采用NTU方法评估热传递性能,验证了该设计在工业应用中的高效性与实用性,建议在制冷、空调、石油精炼等领域推广使用。

k8s6orchestrator的博客 109

数据结构学习笔记——栈和队列

栈(stack)是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。栈的插入操作,叫作进栈,也称压栈、入栈。栈的删除操作,叫作出栈,也称弹栈。在高级语言中,调用自己和其他函数并没有本质的不同。我们把一个一个直接调用自己或通过一系列的调用语句间接第调用自己的函数,称作递归函数。

weixin_43268649的博客 994

x265开源编码器源码框架深度解析

x265开源编码器源码框架深度解析

世界那么大,我想去看看~【随心更新,看世界去了😄】 670

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

数据结构笔记(王道考研) 第三章:栈和队列

数据结构笔记(王道考研) 第三章:栈和队列

zimuzi2019的博客 3162

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数据结构详解笔记:第三章 栈和队列

前言 本章主要详解了栈和队列以及特殊矩阵的压缩知识,其中包括栈的顺序存储和链式存储,队列的顺序存储以及链式存储,循环队列的顺序实现以及优化改进-双端队列,最后介绍了三种特殊矩阵的存储结构压缩算法。 文章目录前言总览:①栈的逻辑结构栈的概念:栈的基本操作:②栈的顺序存储结构顺序栈的结构:顺序栈的基本操作:栈的初始化判断栈空进栈出栈读出栈顶元素栈的非连续输入和输出问题:合法出栈序列的个数:共享栈共享栈的概念③栈的链式存储结构④队列的逻辑结构队列的概念:队列的基本操作:⑤队列的顺序存储顺序队列的概念:链队的实现:

Spuer_Tiger 864

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

栈:限定仅在表尾进行插入和删除操作的线性表。 允许插入和删除的一端称为栈顶,另一端称为栈底。 设指针top指示栈顶元素在数组中的位置。 进栈:top加1 出栈:top减1 栈空:top= -1 栈满:top= MAX_SIZE-1 顺序栈类的声明 : const int MAX_SIZE=100; template <class T> c...

qq_43632319的博客 304

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

一、栈的定义及其基本操作二、栈的顺序存储结构三、栈的链式存储结构四、栈在递归中的应用栈是一种只允许在表的一端进行插入和删除操作的线性表。(应许表的一端进行插入和删除的线性表)define M 100 //两栈共享的存储空间大小//两栈共享的一维数组空间int top[2];//两栈的栈顶指针}DSeqStack;一、队列的定义及其基本操作二、队列的顺序存储结构三、队列的链式存储结构队列是另一种操作受限的线性表,它只允许在表的一端进行插入操作,而在另一端进行删除操作。

lxttzlove的博客 933

数据结构学习笔记(第三章:栈和队列)

第三章:栈3.1 栈的基本概念栈的定义栈结构的特点 3.1 栈的基本概念 栈的定义 首先栈本身也是一种线性表 但是这种线性表规定了只能在某一端进行插入和删除操作 栈结构的特点 栈顶

qq_44993579的博客 845

数据结构(C语言版)学习笔记(第三章:栈和队列)

数据结构学习笔记(第三章:栈和队列)栈栈的基本概念与定义 栈 栈的基本概念与定义

Z_2nd的博客 797

数据结构知识总结笔记------第三章:栈和队列(1) 栈和队列的基本概念,栈和队列的顺序存储与链式存储结构

第三章 栈和队列 3.1、栈 3.1.1栈的基本概念 (1)栈(Stack)的定义 栈是只可以在一端进行插入或删除操作的线性表。栈本质上是一种线性表,但这种线性表限定只能在某一端进行插入和删除操作。 栈顶(Top):允许进行插入或删除操作的一端称为栈顶。 栈底(Bottom):不允许进行插入和删除一端称为栈底。 空栈:不含任何元素的空表。 (2)栈(Stack)的特性 栈的主要特性是后进先出(Last In First Out,LIFO),也可称为先进后出(First In Last Out ,FILO)

DKPT的博客 1372

数据结构与算法——栈和队列

栈和队列是两种重要的线性结构,本篇文章详细总结了数据结构与算法中栈和队列的终点知识,并且结合代码片段实现其基本操作,干货满满,每一句话都是重点,希望能给更多的小伙伴在学习数据结构与算法时带来一定帮助...

小田是个程序员的博客欢迎你的到来呀~ 2万+

【数据结构】栈和队列

然后,我们可以使用STTop取出栈(st)中的数据,进行对栈(s)的左右括号的匹配,如果匹配不成功,则返回false,直到栈(s)为空时,过程结束。若节点大于一个,那我们可以创建一个QNode*的next节点指向队头指向的下一个节点,然后再将队头的节点free,再重新将队头的节点改为next指针指向的新节点。首先,我们来了解一种新的数据结构——栈。将数据导入栈中,首先,将空间进行扩容(防止空间不足引起的越界访问),并将扩容后的空间传给数组a,然后,再于新空间进行导入数据的操作,结尾记得改变新栈的个数。

2301_81348661的博客 3767

[详解栈和队列]数据结构之栈与队列

✅作者简介:大家好,我是Philosophy7?让我们一起共同进步吧!🏆 📃个人主页:Philosophy7的csdn博客 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博>主哦🤞 文章目录栈和队列1.物理结构和逻辑结构2.什么是栈2.1栈的基本操作3.什么是队列队列的基本操作小结 栈和队列 1.物理结构和逻辑结构 再了解栈和队列之前,我们要先知道什么是逻辑结构和物理结构。 逻辑结构: 按照逻辑结构划分:数据结.

Philosophy7的博客 4195

【数据结构】第三章:栈和队列

【数据结构】第三章:栈和队列 一、栈 1. 栈的定义 2. 栈的基本操作 二、顺序栈 1. 顺序栈的实现 2. 顺序栈的基本操作 3. 两种实现方式对比 3. 共享栈 三、链栈 1. 链栈的实现 2. 链栈的基本操作 四、队列 1. 队列的定义 2. 队列的基本操作 3. 双端队列 五、顺序队列 1. 顺序队列的实现 2. 顺序队列的基本操作 3. 三种实现方式对比 六、链队列 1. 链队列的实现 2. 链队列的基本操作 七、栈的应用 1. 括号匹配 2. 表达式求值 3. 递归 八、队列的应用 九、特殊矩

iFulling的博客 1687

【数据结构】栈和队列超详细讲解

我们已经学习了顺序表、链表、数组等数据结构,今天我们再来认识一下栈和队列两种新的数据结构,一起来看看吧~

Become Mad的博客 3102

王道数据结构第三章(栈和队列)笔记

采用顺序存储的栈成为顺序栈。

Java程序员十六的博客 1922

数据结构第三章 栈和队列题目答案

一、选择题 1.栈结构通常采用的两种存储结构是( A )。 A.顺序存储结构和链表存储结构 B.散列方式和索引方式 C.链表存储结构和数组 D.线性链表结构和非线性存储结构 2.在栈操作中,输入序列为(A,B,C,D),不可能得到的输出数列是( D )。 A.(A,B,C,D) B.(D,C,B,A) C.(A,C,D,B) ...

qq_43663263的博客 8297
上一篇: 笔记:数据结构——第二章 线性表
下一篇: 笔记:数据结构——第四章 串
ITS_Oaij
博客等级 码龄6年 1857粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值