栈和队列是两种重要的线性数据结构,它们通过限制插入和删除操作的位置来实现特定的数据管理方式

栈和队列是两种重要的线性数据结构,它们通过限制插入和删除操作的位置来实现特定的数据管理方式。

一、栈的基本概念与操作

栈(Stack)是一种只能在一端进行插入或删除的线性结构,遵循“后进先出”(LIFO, Last In First Out)原则。

  • 基本运算

    1. 初始化:创建一个空栈。
    2. 判空:判断栈是否为空,若空则无法执行出栈操作。
    3. 入栈(Push):将元素添加到栈顶。
    4. 出栈(Pop):移除并返回栈顶元素。
    5. 读取栈顶元素:仅查看栈顶元素而不移除它。
  • 存储结构

    • 顺序栈:使用数组实现,需预先设定最大容量。设 top 指针指示栈顶位置(通常初始为 -1 表示空栈)。当 top == MaxSize - 1 时表示栈满。
      #define MaxSize 100
      typedef struct {
          int data[MaxSize];
          int top;
      } SqStack;
      
    • 链栈:采用单链表实现,头结点或首元节点作为栈顶。插入和删除均在链头完成,无需预分配空间,动态扩展性强。
      typedef struct LinkNode {
          int data;
          struct LinkNode *next;
      } LinkStack;
      
  • 应用场景

    • 表达式求值(如中缀转后缀)
    • 括号匹配检测
    • 函数调用堆栈管理
    • 递归过程模拟(非递归实现)

二、队列的基本概念与操作

队列(Queue)是一种只允许在表尾插入、表头删除的线性结构,遵循“先进先出”(FIFO, First In First Out)原则。

  • 基本运算

    1. 初始化:建立一个空队列。
    2. 判空:检查队列是否为空。
    3. 入队(EnQueue):在队尾添加新元素。
    4. 出队(DeQueue):删除并返回队头元素。
    5. 读取队头元素:仅访问不删除队头元素。
  • 存储结构(顺序队列)
    使用数组存储,设置两个指针:

    • front:指向队头元素前一个位置(或直接指向队头,依实现而定)
    • rear:指向队尾元素位置

    容量固定时存在“假溢出”问题,可通过循环队列解决:

    • 判空条件:front == rear
    • 判满条件:(rear + 1) % MaxSize == front
    • 入队:rear = (rear + 1) % MaxSize
    • 出队:front = (front + 1) % MaxSize
    typedef struct {
        int data[MaxSize];
        int front, rear;
    } CirQueue;
    

    链队列也可用于避免空间限制,以链表形式实现,含队头指针和队尾指针。

  • 应用场景

    • 广度优先搜索(BFS)
    • 任务调度(如打印队列、操作系统进程调度)
    • 缓冲区设计(如消息队列)

核心区别总结

特性栈(Stack)队列(Queue)
操作原则LIFO(后进先出)FIFO(先进先出)
操作端仅栈顶队头删、队尾插
存储方式顺序栈 / 链栈顺序队列 / 链队列 / 循环队列
典型应用函数调用、表达式计算BFS、任务调度

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值