双端队列
定义:双端队列是指允许两端都可以入队和出队操作的队列
- 双端队列允许从两端插入,两端删除的线性表
- 如果只使用其中一端的插入和删除操作,则等同于栈;
- 输入受限的双端队列:允许一端插入,两端删除的线性表
- 输出受限的双端队列:允许两端插入,一端删除的线性表
#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]; // 返回队尾元素的值
}