Leo Technology Stack Leo Technology Stack
首页
  • Android
  • Web
  • SpringBoot
  • 数据库
  • Docker
  • Netty
  • KubeSphere
  • Linux
  • Android Framework
  • 开源库
思维
  • 面试
  • 投资理财
  • 杂事记录
  • 索引

    • 分类
    • 标签
    • 归档
  • 开源项目

    • Advance Markdown
    • AnLibrary (opens new window)

Leo

不知名的架构师
首页
  • Android
  • Web
  • SpringBoot
  • 数据库
  • Docker
  • Netty
  • KubeSphere
  • Linux
  • Android Framework
  • 开源库
思维
  • 面试
  • 投资理财
  • 杂事记录
  • 索引

    • 分类
    • 标签
    • 归档
  • 开源项目

    • Advance Markdown
    • AnLibrary (opens new window)
  • 栈和队列

    • 栈的基本概念
      • 基本操作
      • 顺序栈
      • 链式栈
    • 队列
      • 基本操作
      • 顺序队
      • 循环队列
      • 链队
      • 输出序列
    • 应用
    • notes
    • thinking
    • Data Structure
    Leo
    2021-08-02

    栈和队列

    # 栈的基本概念

    栈(Stack)只允许在一端进行插入或者删除操作的线性表

    FILO: Firt In Last Out

    # 基本操作

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

    # 顺序栈

    采用顺序存储的栈

    
    #define MaxSize 50
    typedef struct{
        ElemType data[MaxSize];
        int top;
    }SqStack;
    
    
    1
    2
    3
    4
    5
    6
    7

    # 共享栈

    将两个栈底设置在空间的两端,栈顶向空间中间延伸

    判空:0号栈top==-1
    1号栈top==MaxSize
    栈满:top1-top0==1

    优点:存取时间复杂度仍为O(1),但空间利用更有效

    # 链式栈

    采用链式存储的栈

    typedef struct LinkNode{
        ElemType data;
        struct LinkNode *next;
    } *LiStack;
    
    
    1
    2
    3
    4
    5

    所有操作都在表头执行

    # 队列

    队列(Queue)只允许在表的一端进行插入,表的另一端进行删除操作的线性表

    # 基本操作

    • InitQueue(&Q):初始化一个空栈
    • QueueEmpty(Q):判断栈是否为空,若栈为空则返回true,否则返回false
    • EnQueue(&Q,x):入队,若队列Q未满,则将x加入使之成为新队尾
    • DeQueue(&Q,&x):出队,若队列非空,则删除队头元素,并用x返回
    • GetHead(Q,&x):读队头元素,若Q非空,则用x返回队头元素
    • ClearQueue(&Q):销毁队列,并释放Q占用的内存空间

    # 顺序队

    采用顺序存储的队列

    
    #define MaxSize 50
    typedef struct{
        ElemType data[MaxSize];
        int front;  //  队头元素(队头元素的前一位置)
        int rear;   //队尾元素的下一个位置(指向队尾元素)
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8

    初始化front==rear==0
    队空条件:Q.front == Q.rear
    队长:Q.rear-Q.front

    # 循环队列

    把存储队列的顺序队列在逻辑上视为一个环

    front指针移动:Q.front = (Q.front+1)% MaxSize
    rear指针移动:Q.rear = (Q.rear+1)% MaxSize
    队列长度:(Q.rear+MaxSize-Q.front)% MaxSize

    # 链队

    采用链式存储的队列

    typedef struct {
      ElemType data;
      struct LinkNode *next;
    }LinkNode;
    
    
    1
    2
    3
    4
    5
    typedef struct{
        LinkNode *front,*rear;
    }LinkQueue;
    
    
    1
    2
    3
    4

    # 输出序列

    # 应用

    编辑此页 (opens new window)
    上次更新: 2022-04-28, 11:21:32
    Theme by Leo | Copyright © 2016-2022 Leo | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式