队列的实现

队列的表现:

一维数组是队列的直接表现,我们可以直接使用一维数组来做队列

另外,我们也可以使用堆栈来实现队列

队列的操作:

入队:新的元素要放置到队列中 

出队:把队列中的元素移出队列

存在两个序列变量: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);
	}
	
}

完整示例:

1. 111. 二叉树的最小深度 

        在广度优先算法当中,我们需要逐层遍历树的节点,用队列实现

2. 232. 用栈实现队列

        不同于用一维数组实现队列,用栈来实现也是一个有趣的写法(顺便把栈熟悉了)

更多数据结构详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值