双端队列的实现——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时,队列是满的,此时若试图插入一个元素,则队列发生上溢。

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是双端队列C语言代码: ``` #include <stdio.h> #define MAX_SIZE 10 int deque[MAX_SIZE]; int front = -1; int rear = -1; void insertFront(int element) { if ((front == 0 && rear == MAX_SIZE - 1) || (front == rear + 1)) { printf("Deque is full\n"); return; } if (front == -1 && rear == -1) { front = 0; rear = 0; } else if (front == 0) { front = MAX_SIZE - 1; } else { front--; } deque[front] = element; printf("%d inserted at front\n", element); } void insertRear(int element) { if ((front == 0 && rear == MAX_SIZE - 1) || (front == rear + 1)) { printf("Deque is full\n"); return; } if (front == -1 && rear == -1) { front = 0; rear = 0; } else if (rear == MAX_SIZE - 1) { rear = 0; } else { rear++; } deque[rear] = element; printf("%d inserted at rear\n", element); } void deleteFront() { if (front == -1 && rear == -1) { printf("Deque is empty\n"); return; } printf("%d deleted from front\n", deque[front]); if (front == rear) { front = -1; rear = -1; } else if (front == MAX_SIZE - 1) { front = 0; } else { front++; } } void deleteRear() { if (front == -1 && rear == -1) { printf("Deque is empty\n"); return; } printf("%d deleted from rear\n", deque[rear]); if (front == rear) { front = -1; rear = -1; } else if (rear == 0) { rear = MAX_SIZE - 1; } else { rear--; } } void display() { if (front == -1 && rear == -1) { printf("Deque is empty\n"); return; } printf("The elements in the deque are: "); if (front <= rear) { for (int i = front; i <= rear; i++) { printf("%d ", deque[i]); } } else { for (int i = front; i < MAX_SIZE; i++) { printf("%d ", deque[i]); } for (int i = 0; i <= rear; i++) { printf("%d ", deque[i]); } } printf("\n"); } int main() { int choice, element; do { printf("Choose an option:\n"); printf("1. Insert element at front\n"); printf("2. Insert element at rear\n"); printf("3. Delete element from front\n"); printf("4. Delete element from rear\n"); printf("5. Display the deque\n"); printf("6. Exit\n"); scanf("%d", &choice); switch (choice) { case 1: printf("Enter the element to be inserted at front: "); scanf("%d", &element); insertFront(element); break; case 2: printf("Enter the element to be inserted at rear: "); scanf("%d", &element); insertRear(element); break; case 3: deleteFront(); break; case 4: deleteRear(); break; case 5: display(); break; case 6: printf("Exiting...\n"); break; default: printf("Invalid choice\n"); break; } } while (choice != 6); return 0; } ``` 希望能满足您的需求,如果还有其他问题欢迎提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值