题目要求:
插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(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时,队列是满的,此时若试图插入一个元素,则队列发生上溢。