• 栈、队列应用


    目录

    栈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

    双端队列  三图

    栈、队列的应用

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

     

  • 相关阅读:
    华为机试真题 C++ 实现【正方形数量 】
    Oracle Net Configuration Assistant 配置步骤
    C++ Crow web框架使用;升级cmake ;pthread、boost、asio 报错
    python 内置函数或函数(争取日更)
    操作系统知识点-处理机调度
    idea build cannot find symbol
    基于SpringBoot+VUE的线上教学管理平台系统
    merge into 更新和插入
    MQ - 19 安全_限流方案的设计
    【分享】Windows系统自动更新怎么永久停止?嘘!一般人我不告诉他,快进来看!
  • 原文地址:https://blog.csdn.net/qq_45181299/article/details/126051403