栈和队列是两种重要的线性数据结构,它们通过限制插入和删除操作的位置来实现特定的数据管理方式。
一、栈的基本概念与操作
栈(Stack)是一种只能在一端进行插入或删除的线性结构,遵循“后进先出”(LIFO, Last In First Out)原则。
-
基本运算:
- 初始化:创建一个空栈。
- 判空:判断栈是否为空,若空则无法执行出栈操作。
- 入栈(Push):将元素添加到栈顶。
- 出栈(Pop):移除并返回栈顶元素。
- 读取栈顶元素:仅查看栈顶元素而不移除它。
-
存储结构:
- 顺序栈:使用数组实现,需预先设定最大容量。设
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)原则。
-
基本运算:
- 初始化:建立一个空队列。
- 判空:检查队列是否为空。
- 入队(EnQueue):在队尾添加新元素。
- 出队(DeQueue):删除并返回队头元素。
- 读取队头元素:仅访问不删除队头元素。
-
存储结构(顺序队列):
使用数组存储,设置两个指针: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、任务调度 |



被折叠的 条评论
为什么被折叠?



