双端队列的实现——C语言

题目要求:

插入删除元素只能在同一端进行,队列插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),插入删除操作都可以在两端进行。写出4 个时间均为0(1)的过程,分别实现在双端队列的两端插人和删除元素的操作,该队列是用一个数组实现的。

解题思路:

利用数组来存储元素,设置两个变量head和tail,分别记录队列头部元素的下标和尾部“将要插入”元素的下标。从尾部入队时,tail+1,如果到了数组最后,则折返到0。从头部出队时,head+1,如果到了数组最后,则折返回0。从尾部出队时,tail-1,如果到了0再减则回到数组最后元素。从头部入队时,head-1,如果到了0再减则回到数组最后元素。

代码如下:

#include<stdio.h>
struct Deque{
	int a[20];
	int head;//第一个元素的下标 
	int tail;//将要插入元素的下标 
};
void insert_head(struct Dequeue *q,int n){
	if((q->tail+1)==q->head){
		printf("Queue has no room!\n");
		return;
	}
	q->head = (q->head-1)%20;
	q->a[q->head] = n;
}
void insert_tail(struct Dequeue *q,int n){
	f((q->tail+1)==q->head){
		printf("Queue has no room!\n");
		return;
	}
	q->tail = (q->tail+1)%20;
	q->a[q->tail] = n;
}
int delete_head(struct Dequeue *q){
	if(q->head == q->tail){
		printf("Queue has no node!\n");
		return -1;
	}
	int n = q->a[q->head];
	q->head = (q->head+1)%20;
	return n;
}
int delete_tail(struct Dequeue *q){
	if(q->head == q->tail){
		printf("Queue has no node!\n");
		return -1;
	}
	int n = q->a[q->tail];
	q->tail = (q->tail-1)%20;
	return n;
}
int main(){
	struct Dequeue q;
	insert_tail(&q,1);
	insert_tail(&q,2);
	delete_head(&q);
	insert_head(&q,3);
	return 0;
} 

注意:

若数组的长度为n,则该队列最多容纳n-1个元素。队列中的元素存放在位置Q.head,Q.head+1,……,Q.tail-1,并在最后的位置“环绕”,感觉好像位置1紧邻在位置n后面形成一个环序。当Q.head=Q.tail时,队列为空。初始时有Q.head = Q.tail=0。如果试图从空队列中删除一个元素,则队列发生下溢。当Q.head = Q.tail + 1时,队列是满的,此时若试图插入一个元素,则队列发生上溢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值