栈与队列的模拟实现解析
栈的模拟实现
栈是一种后进先出(LIFO)的数据结构,核心操作包括压栈(push)、弹栈(pop)和查看栈顶元素(peek)。可以通过数组或链表实现。
数组实现栈
定义一个固定大小的数组存储元素,同时维护一个栈顶指针(通常为整型变量)。压栈时将元素放入数组并移动指针,弹栈时返回栈顶元素并移动指针。
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
void push(Stack *s, int value) {
if (s->top < MAX_SIZE) {
s->data[s->top++] = value;
}
}
int pop(Stack *s) {
if (s->top > 0) {
return s->data[--s->top];
}
return -1; // 栈空标志
}
链表实现栈
使用单链表,每次压栈在链表头部插入节点,弹栈时删除头节点。无需预设容量限制。
typedef struct Node {
int data;
struct Node *next;
} Node;
typedef struct {
Node *top;
} Stack;
void push(Stack *s, int value) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = value;
newNode->next = s->top;
s->top = newNode;
}
int pop(Stack *s) {
if (s->top != NULL) {
Node *temp = s->top;
int value = temp->data;
s->top = temp->next;
free(temp);
return value;
}
return -1;
}
队列的模拟实现
队列是先进先出(FIFO)的数据结构,核心操作包括入队(enqueue)、出队(dequeue)和查看队首元素(front)。同样可通过数组或链表实现。
数组实现循环队列
使用固定大小的数组和两个指针(front和rear)模拟循环队列。入队时移动rear指针,出队时移动front指针,利用取模运算处理边界。
#define QUEUE_SIZE 100
typedef struct {
int data[QUEUE_SIZE];
int front, rear;
} Queue;
void enqueue(Queue *q, int value) {
if ((q->rear + 1) % QUEUE_SIZE != q->front) {
q->data[q->rear] = value;
q->rear = (q->rear + 1) % QUEUE_SIZE;
}
}
int dequeue(Queue *q) {
if (q->front != q->rear) {
int value = q->data[q->front];
q->front = (q->front + 1) % QUEUE_SIZE;
return value;
}
return -1; // 队空标志
}
链表实现队列
使用带头尾指针的单链表。入队在尾部插入节点,出队从头部删除节点。动态内存分配避免空间浪费。
typedef struct QNode {
int data;
struct QNode *next;
} QNode;
typedef struct {
QNode *front, *rear;
} Queue;
void enqueue(Queue *q, int value) {
QNode *newNode = (QNode *)malloc(sizeof(QNode));
newNode->data = value;
newNode->next = NULL;
if (q->rear == NULL) {
q->front = q->rear = newNode;
} else {
q->rear->next = newNode;
q->rear = newNode;
}
}
int dequeue(Queue *q) {
if (q->front != NULL) {
QNode *temp = q->front;
int value = temp->data;
q->front = temp->next;
if (q->front == NULL) q->rear = NULL;
free(temp);
return value;
}
return -1;
}
复杂度分析
-
栈
数组和链表实现的压栈、弹栈操作均为 $O(1)$ 时间复杂度。数组实现有固定容量限制,链表实现空间更灵活但需处理动态内存。 -
队列
循环队列的入队出队为 $O(1)$,链表实现同样为 $O(1)$。循环队列需处理满队条件,链表实现需维护头尾指针。
应用场景对比
-
栈
函数调用栈、表达式求值(如括号匹配)、回溯算法(如DFS)。 -
队列
任务调度(如CPU轮转)、缓冲区管理(如打印队列)、广度优先搜索(BFS)。
通过模拟实现可深入理解两种结构的差异:栈的LIFO特性适合反向处理,队列的FIFO特性适合顺序调度。实际开发中可根据需求选择底层实现方式。
BbS.okapop143.sbs/PoSt/1122_266617.HtM
BbS.okapop144.sbs/PoSt/1122_654047.HtM
BbS.okapop145.sbs/PoSt/1122_384502.HtM
BbS.okapop146.sbs/PoSt/1122_726461.HtM
BbS.okapop147.sbs/PoSt/1122_684578.HtM
BbS.okapop148.sbs/PoSt/1122_258900.HtM
BbS.okapop149.sbs/PoSt/1122_581425.HtM
BbS.okapop150.sbs/PoSt/1122_926741.HtM
BbS.okapop151.sbs/PoSt/1122_710414.HtM
BbS.okapop152.sbs/PoSt/1122_051612.HtM
BbS.okapop143.sbs/PoSt/1122_758432.HtM
BbS.okapop144.sbs/PoSt/1122_645907.HtM
BbS.okapop145.sbs/PoSt/1122_082244.HtM
BbS.okapop146.sbs/PoSt/1122_304308.HtM
BbS.okapop147.sbs/PoSt/1122_247937.HtM
BbS.okapop148.sbs/PoSt/1122_221884.HtM
BbS.okapop149.sbs/PoSt/1122_321071.HtM
BbS.okapop150.sbs/PoSt/1122_642692.HtM
BbS.okapop151.sbs/PoSt/1122_250997.HtM
BbS.okapop152.sbs/PoSt/1122_134163.HtM
BbS.okapop143.sbs/PoSt/1122_445395.HtM
BbS.okapop144.sbs/PoSt/1122_936105.HtM
BbS.okapop145.sbs/PoSt/1122_347915.HtM
BbS.okapop146.sbs/PoSt/1122_068510.HtM
BbS.okapop147.sbs/PoSt/1122_340339.HtM
BbS.okapop148.sbs/PoSt/1122_516119.HtM
BbS.okapop149.sbs/PoSt/1122_539894.HtM
BbS.okapop150.sbs/PoSt/1122_549390.HtM
BbS.okapop151.sbs/PoSt/1122_056643.HtM
BbS.okapop152.sbs/PoSt/1122_400900.HtM
BbS.okapop143.sbs/PoSt/1122_447740.HtM
BbS.okapop144.sbs/PoSt/1122_223190.HtM
BbS.okapop145.sbs/PoSt/1122_775139.HtM
BbS.okapop146.sbs/PoSt/1122_511108.HtM
BbS.okapop147.sbs/PoSt/1122_969727.HtM
BbS.okapop148.sbs/PoSt/1122_343185.HtM
BbS.okapop149.sbs/PoSt/1122_045072.HtM
BbS.okapop150.sbs/PoSt/1122_457892.HtM
BbS.okapop151.sbs/PoSt/1122_450205.HtM
BbS.okapop152.sbs/PoSt/1122_269589.HtM
BbS.okapop143.sbs/PoSt/1122_068780.HtM
BbS.okapop144.sbs/PoSt/1122_938879.HtM
BbS.okapop145.sbs/PoSt/1122_161392.HtM
BbS.okapop146.sbs/PoSt/1122_193638.HtM
BbS.okapop147.sbs/PoSt/1122_789888.HtM
BbS.okapop148.sbs/PoSt/1122_560927.HtM
BbS.okapop149.sbs/PoSt/1122_487816.HtM
BbS.okapop150.sbs/PoSt/1122_079540.HtM
BbS.okapop151.sbs/PoSt/1122_924667.HtM
BbS.okapop152.sbs/PoSt/1122_031766.HtM
BbS.okapop143.sbs/PoSt/1122_782498.HtM
BbS.okapop144.sbs/PoSt/1122_789994.HtM
BbS.okapop145.sbs/PoSt/1122_727463.HtM
BbS.okapop146.sbs/PoSt/1122_384914.HtM
BbS.okapop147.sbs/PoSt/1122_727435.HtM
BbS.okapop148.sbs/PoSt/1122_791453.HtM
BbS.okapop149.sbs/PoSt/1122_789631.HtM
BbS.okapop150.sbs/PoSt/1122_998382.HtM
BbS.okapop151.sbs/PoSt/1122_509288.HtM
BbS.okapop152.sbs/PoSt/1122_873208.HtM
BbS.okapop153.sbs/PoSt/1122_990615.HtM
BbS.okapop154.sbs/PoSt/1122_412982.HtM
BbS.okapop155.sbs/PoSt/1122_801977.HtM
BbS.okapop156.sbs/PoSt/1122_066119.HtM
BbS.okapop157.sbs/PoSt/1122_314467.HtM
BbS.okapop158.sbs/PoSt/1122_513489.HtM
BbS.okapop159.sbs/PoSt/1122_810532.HtM
BbS.okapop160.sbs/PoSt/1122_167258.HtM
BbS.okapop161.sbs/PoSt/1122_416693.HtM
BbS.okapop162.sbs/PoSt/1122_012231.HtM
BbS.okapop153.sbs/PoSt/1122_416939.HtM
BbS.okapop154.sbs/PoSt/1122_577201.HtM
BbS.okapop155.sbs/PoSt/1122_082156.HtM
BbS.okapop156.sbs/PoSt/1122_720034.HtM
BbS.okapop157.sbs/PoSt/1122_528138.HtM
BbS.okapop158.sbs/PoSt/1122_893193.HtM
BbS.okapop159.sbs/PoSt/1122_275058.HtM
BbS.okapop160.sbs/PoSt/1122_919490.HtM
BbS.okapop161.sbs/PoSt/1122_413937.HtM
BbS.okapop162.sbs/PoSt/1122_566729.HtM

查看3道真题和解析