1. 项目概述:用双栈模拟队列的核心思路
在数据结构的世界里,栈和队列就像是一对性格迥异的双胞胎。栈遵循LIFO(后进先出)原则,而队列则坚持FIFO(先进先出)的规则。今天我们要探讨的,是如何用两个性格"固执"的栈,模拟出一个行为"绅士"的队列。
这个看似矛盾的需求在实际开发中其实非常常见。比如在嵌入式系统中,当内存资源有限时,我们可能需要复用已有的栈结构来实现队列功能;又或者在算法面试中,这几乎是一道必考题。用C语言实现这个方案尤其具有教学意义,因为它能让我们清晰地看到内存操作的每个细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据结构设计与内存模型
2.1 双栈队列的基本原理
想象你有两个箱子(栈),我们暂且命名为stackIn和stackOut。当有新元素要入队时,我们把它放进stackIn;当需要出队时,如果stackOut为空,就把stackIn的所有元素"倒进"stackOut,然后从stackOut取出栈顶元素。
这种设计的美妙之处在于:
- 入队操作的时间复杂度为O(1)
- 出队操作的均摊时间复杂度也是O(1)
- 空间复杂度为O(n),与普通队列相同
2.2 C语言实现的内存布局
在C语言中,我们需要特别注意内存管理。以下是典型的内存模型:
code复制+---------------------+
| stackIn |
| (动态数组或链表) |
+---------------------+
| stackOut |
| (动态数组或链表) |
+---------------------+
| 其他程序数据 |
+---------------------+
每个栈的实现可以选择数组或链表。数组实现更节省内存但大小固定,链表实现更灵活但需要额外的指针空间。在嵌入式环境中,数组实现通常更受欢迎。
3. 完整代码实现与解析
3.1 结构体定义与初始化
c复制#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
typedef s
