队列的表现:
一维数组是队列的直接表现,我们可以直接使用一维数组来做队列
另外,我们也可以使用堆栈来实现队列
队列的操作:
入队:新的元素要放置到队列中
出队:把队列中的元素移出队列
存在两个序列变量:front, rear 分别指代队列头以及队列末
入队操作将新的元素放到 rear 位置,rear指向其后位置
出队操作将 front 位置的元素移出队列,front指向其后位置
初始化 front,rear 指向首元素空位
当front,rear再次相等时表面队列为空
队列的特性:
FIFO:先进先出,最先放的元素,出队时先出
队列图示:
队列的实现:
简单实现不是循环数组,后续自己改造也很方便,不做展示
1. 队列的元素我们稍微复杂一点,元素为树的节点
定义一个长度为 10 的队列,front,rear 初始为 0 坐标
struct TreeNode {
int val;
int deep;
struct TreeNode *left;
struct TreeNode *right;
};
struct TreeNode queue[10];
int front = 0;
int rear = 0;
2. 入队操作
入队需要用到 rear,判断队列是否还有空间,如果有新元素存放到 rear 位置,rear指向其后位置
int enqueue(struct TreeNode* queue, int len, int *rear, struct TreeNode* data)
{
if(*rear == len) // fulll
return -1;
queue[*rear] = *data;
(*rear)++;
return 0;
}
3. 出队操作
当 front 与 rear 指向相同时,队列为空;否则移出 front 位置元素,front指向其后位置
struct TreeNode* dequeue(struct TreeNode* queue, int len, int *front, int *rear)
{
if(*front == *rear) // empty
return NULL;
int idx = *front;
if(idx == len - 1)
{
*front = 0;
*rear = 0;
}
else
(*front)++;
return &queue[idx];
}
4. 打印队列
void showqueue(struct TreeNode* queue, int len)
{
int i;
for(i=0; i<len; i++)
{
printf("queue[%d]=%d\n", i, queue[i].val);
}
}
完整示例:
在广度优先算法当中,我们需要逐层遍历树的节点,用队列实现
2. 232. 用栈实现队列
不同于用一维数组实现队列,用栈来实现也是一个有趣的写法(顺便把栈熟悉了)