• 栈、队列应用


    目录

    栈LIFO

    栈基本操作

    顺序栈的实现

    初始化

    判断栈空

    进栈

    出栈

    读栈顶元素

    链式存储 

    队列FIFO  

    基本操作

    顺序存储

    循环队列

    循环队列的基本操作 

    初始化 

    判空

    入队

    出队

    链式存储

    基本操作(通常带头结点)

    初始化

    判空

    入队

    出队

    双端队列  三图

    栈、队列的应用


    栈LIFO

    栈的数学性质 卡特兰(Catalan)数 
    n个元素进栈,出栈元素不同排列个数为

    \frac{1}{n+1}\cdot C_{2n}^{n}

    栈基本操作

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

    顺序栈的实现

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

    栈空条件 S.top==-1;
    栈满条件 S.top==MaxSize-1; 
    栈长:S.top+1;

    初始化

    1. void InitStack(SqStack &S){
    2. S.top=-1;//初始化栈顶指针
    3. }

    判断栈空

    1. bool StackEmpty(SqStack S){
    2. if(S.top==-1)//栈空
    3. return true;
    4. return false;//非空
    5. }

    进栈

    1. bool Push(SqStack &S,ElemType x){
    2. if(S.top==MaxSize-1)//栈满 报错
    3. return false;
    4. S.data[++S.top]=x;//指针先加1,再入栈
    5. return true;
    6. }

    出栈

    1. bool Pop(SqStack &S,ElemType x){
    2. if(S.top==-1)//栈空 报错
    3. return false;
    4. x=S.data[S.top--];//先出栈,指针再减1
    5. return true;
    6. }

    读栈顶元素

    1. bool GetTop(SqStack S,ElemType &x){
    2. if(S.top==-1)//栈空 报错
    3. return false;
    4. x=S.data[S.top];//x记录栈顶元素
    5. return true;
    6. }

    链式存储 

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

    队列FIFO  

    基本操作

    InitQueue(&Q);//初始化队列,构造一个空队列Q
    QueueEmpty(Q);//判断队列空,若队列Q为空 则返回true 
    EnQueue(&Q,x);//入队,若队列Q未满,将z加入,使之成为新的队尾 
    DeQueue(&Q,&x);//出队,若队列Q非空,删除队头元素,并用x返回 
    GetHead(Q,&x);// 读队头元素,若队列Q非空,则将队头元素赋值给x 

    顺序存储

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

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

    循环队列

    牺牲一个单元来区分队空和队满
    队满条件:(Q.rear+1)%MaxSize==Q.front;
    队空条件:Q.front==Q.rear;
    队列中元素个数:(Q.rear-Q.front+MaxSize)%MaxSize;

    循环队列的基本操作 

    初始化 

    1. void InitQueue(SqQueue &Q){
    2. Q.rear=Q.front=0;//初始化队首、队尾指针
    3. }

    判空

    1. bool isEmpty(SqQueue Q){
    2. if(Q.rear==Q.front)return true;//队空条件
    3. else return false;
    4. }

    入队

    1. bool EnQueue(SqQueue &Q,ElemType x){
    2. if((Q.rear+1)%MaxSize==Q.front)
    3. return false;//队满 报错
    4. Q.data[Q.rear]=x;
    5. Q.rear=(Q.rear+1)%MaxSize;//队尾指针加1,取模
    6. return true;
    7. }

    出队

    1. bool DeQueue(SqQueue &Q,ElemType &x){
    2. if(Q.rear==Q.front)
    3. return false;//队空 报错
    4. x=Q.data[Q.front];
    5. Q.front=(Q.front+1)%MaxSize;//队头指针加1,取模
    6. return true;
    7. }

    链式存储

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

    基本操作(通常带头结点)

    初始化

    1. void InitQueue(LinkQueue &Q){
    2.     Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));//建立头结点
    3.     Q.front->next=NULL;//初始为空 
    4. }

    判空

    1. bool IsEmpty(LinkQueue Q){
    2.     if(Q.front==Q.rear)return true;
    3.     return false;

    入队

    1. void EnQueue(LinkQueue &Q,ElemType x){
    2.     LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
    3.     s->data=x;//创建新结点  插入到链尾 
    4.     s->next=NULL;
    5.     Q.rear->next=s;
    6.     Q.rear=s; 
    7. }

    出队

    1. bool DeQueue(LinkQueue &Q,ElemType &x){
    2.     if(Q.front==Q.rear)return false;//队空
    3.     LinkNode *p=Q.front->next;
    4.     x=p->data;
    5.     Q.front->next=p->next;
    6.     if(Q.rear==p)
    7.         Q.rear=Q.front;//若原队列中只有一个结点,删除后变空
    8.     free(p);
    9.     return true

    双端队列  三图

    栈、队列的应用

    栈在括号匹配中的应用
    栈在表达式求值中的应用
    栈在递归中的应用
    队列在层次遍历中的应用
    队列在计算机系统中的应用

     

  • 相关阅读:
    计算机算法分析与设计(12)---贪心算法(最优装载问题和哈夫曼编码问题)
    【KEIL4.74】社区版安装与激活详细步骤教程
    python学习15--数据分析(matplotlib、numpy)
    ubuntu 安装postgresql,增加VECTOR向量数据库插件 踏坑详细流程
    7-58 修理牧场——优先队列
    C语言--每日五道练习题--Day17
    华为机试 - 最小传输时延
    G. The Morning Star
    jQuery 入门-----第三节:jQuery事件
    变分自编码器(VAE)公式推导
  • 原文地址:https://blog.csdn.net/qq_45181299/article/details/126051403