双端队列:左右两端都可以进行入队和出队操作
实现方式:循环数组
操作:
(1)初始化
#include<stdio.h>
#include<stdlib.h>
#define maxx 20
//双端队列
typedef struct
{
int *data;
int left;
int right;
int sum;//标记是否已满
}DouQueue;
//初始化
DouQueue* InitDouQueue()
{
DouQueue* dq = (DouQueue*)malloc(sizeof(DouQueue));
if(dq == NULL)
{
printf("内存申请失败\n");
return NULL;
}
dq->data = (int*)malloc(sizeof(int)*maxx);
if(dq == NULL)
{
printf("内存申请失败\n");
return NULL;
}
dq->left = 0;
dq->right = 0;
dq->sum = 0;
return dq;
}
(2)左端入队
//左端入队
void LeEnQueue(DouQueue* dq,int k)
{
if(dq->sum == maxx)
{
printf("队列已满\n");
return;
}
dq->data[dq->left] = k;
dq->left = (dq->left - 1 + maxx) % maxx;
dq->sum++;
}
(3)左端出队
//左端出队
void LeDeQueue(DouQueue* dq)
{
if(dq->sum == 0)
{
printf("队列为空\n");
return ;
}
int x = dq->data[dq->left];
printf("%d出队\n");
dq->left = (dq->left+1)%maxx;
dq->sum--;
}
(4)右端入队
//右端入队
void RiEnQueue(DouQueue* dq,int k)
{
if(dq->sum == maxx)
{
printf("队列已满\n");
return;
}
dq->data[dq->right] = k;
dq->right = (dq->right+1) % maxx;
dq->sum++;
}
(5)右端出队
//右端出队
void RiDeQueue(DouQueue* dq)
{
if(dq->sum == 0)
{
printf("队列为空\n");
return;
}
int x = dq->data[dq->right];
dq->right = (dq->right-1) % maxx;
dq->sum--;
}
(6)判空
//判空
int isEmpty(DouQueue* dq)
{
if(dq->sum == 0)
{
return 1;//空
}
return 0;//非空
}
(7)判满
//判满
int isFull(DouQueue* dq)
{
if(dq->sum == maxx)
{
return 1;//满
}
return 0;//非满
}