08双端队列代码实现

该文介绍了一个C语言实现的双端队列数据结构,包括初始化、判断队列空/满、在队头/队尾插入和删除元素以及获取队头/队尾元素值的功能。代码示例展示了如何操作这种允许两端插入和删除的线性表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双端队列

定义:双端队列是指允许两端都可以入队和出队操作的队列

  • 双端队列允许从两端插入,两端删除的线性表
  • 如果只使用其中一端的插入和删除操作,则等同于栈;
  • 输入受限的双端队列:允许一端插入,两端删除的线性表
  • 输出受限的双端队列:允许两端插入,一端删除的线性表

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>

#define MaxSize 100

typedef struct doubleQueue {
	int front;//队头指针
	int rear; //队尾指针
	int data[MaxSize];  //队列数据
}Deque;

//初始化双端队列
void Initdeque (Deque*dq)
{
	dq->front = dq->rear = 0;  // 队头和队尾指针都指向0
}

//判断双端队列是否为空
bool IsEmpty(Deque dq)
{
	if (dq.front == dq.rear) //队头和队尾指针相同时,队列为空 
	{
		return true;
	}
	else return false;
}

//判断双端队列是否已满
bool IsFull(Deque dq)
{
	if ((dq.rear + 1) % MaxSize == dq.front)
	{
		return true;
	}
	else return false;
}

//在队头插入元素
void inserthead(Deque* dq, int e)
{
	if (IsFull(*dq))   //判满
	{
		printf("Deque is full\n");
		return;
	}
	dq->front = (dq->front - 1 + MaxSize) % MaxSize;  //队头指针向前移动一位
	dq->data[dq->front] == e; // 在队头插入元素
}

//在队尾插入元素
void inserttail(Deque* dq, int e)
{
	if (IsFull(*dq))   //判满
	{
		printf("Deque is full\n");
		return;
	}
	dq->data[dq->rear] == e;// 在队尾插入元素
	dq->rear = (dq->rear + 1) % MaxSize; // 队尾指针向后移动一位
}

//从队头删除元素
int remove_head(Deque* dq)
{
	if (IsEmpty(*dq))// 如果队列为空,则不能删除元素
	{
		printf("Deque is empty!\n");
		return -1;
	}
	int temp = dq->data[dq->front];// 取出队头元素的值
	dq->front = (dq->front + 1) % MaxSize;// 队头指针向后移动一位
	return temp;
}

// 从队尾删除元素
int remove_tail(Deque* dq)
{
	if (IsEmpty(*dq))// 如果队列为空,则不能删除元素
	{
		printf("Deque is empty!\n");
		return -1;
	}
	dq->rear = (dq->rear - 1 + MaxSize) % MaxSize;   //队尾指针向前移动一位
	int temp = dq->data[dq->rear];//取出队尾元素的值
	return temp;
}

//获得队头元素的值
int Gethead(Deque dq)
{
	if (IsEmpty(dq))
	{
		printf("Deque is empty!\n");
		return -1;
	}
	return dq.data[dq.front];
}

//获得队尾元素的值
/*这个函数的实现与获取队头元素的值的函数实现类似,只不过需要计算队尾元素的下标。因为队尾指针指向的位置是下一个要插入的位置,而不是当前的元素位置,所以需要减1才能得到队尾元素的下标。*/
int Getail(Deque dq)
{
	if (IsEmpty(dq))
	{
		printf("Deque is empty!\n");
		return -1;
	}
	int rearIndex = (dq.rear - 1 + MaxSize) % MaxSize; // 计算队尾元素的下标
	return dq.data[rearIndex]; // 返回队尾元素的值
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tian Meng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值