属性集合:
定义一个指针(数组)用来存放元素
定义左右指针
定义当前最大数组的尺寸
定义当前元素个数
int *queue;//数组放元素
int left,right;//分左右端指针
int maxsize;//当前最大数组尺寸
int size;//当前元素个数
初始化函数:
先动态内存开辟出一块空间
再将maxsize赋值为10
初始化size为0
左右指针皆标记下标0
void initqueue()
{//初始化
queue=(int*)malloc(sizeof(int)*msize);
maxsize=msize;
size=0;
left=right=0;
}
函数操作部分:
操作4种:左边插入删除,右边插入删除
左插函数:
先判断数组有没有满
如果没有满则将左指针减一
再加上maxsize再对maxsize取余从而下标循环防止出界
再将左指针对应下标位置写入数据k
再将size(实际元素个数)加一
void insert_left(int k)
{
if(size==maxsize)
{
printf("满\n");//报错队满,失败或扩容
}
else
{
left--;//相当于前端延长
left=(left+maxsize)%maxsize;//防止出界
queue[left]=k;
size++;
}
}
左边删除函数:
先定义一个变量x用来保存待删除元素
先判空
如果非空则先将待删除元素的数据写入x
再将左指针向前移动一位,并且取余判断循环
实际元素个数再减少一个
void de_left()
{
int x;
if(size==0)
{
printf("空\n");//空,报错
}
else{
x=queue[left];
left=(left+1)%maxsize;
size--;
}
}
右边插入函数:
先进行判满
如果没有满则先在对应下标写入数据(即下标0写入右边插入的数据)
再移动指针并且判断循环
最后再实际元素个数加一
//右边
void insert_right(int k)
{
if(size==maxsize)
{
printf("满\n");//报错队满,失败或扩容
}
else
{
queue[right]=k;//先放入,再移动指针
right=(right+1) %maxsize;//right指向最右端元素的下一个位置
size++;
}
}
右删函数:
先定义一个变量x来写入待删除元素的数据
先进行判空
如果非空
则先右指针移动再循环判断
实际元素减一
最后将待删除数据写入x(此时我们认为被右指针指向的数据为脏数据)
void de_right()
{
int x;
if(size==0)
{
printf("空\n");//空,报错
}
else{
right--;
right=(right+maxsize)%maxsize;
size--;
x=queue[right];
}
}
双端队列打印函数:
先判断左指针是否为0如果为0则说明没有左插的元素
如果不为0则循环打印左插的元素
之后再循环判断右插的元素
void printff()
{
int x=left;
int y=right;
//printf("%d\n",x);
if(x!=0)
{
for(int i=x;i<maxsize;i++)
{
printf("%d ",queue[i]);
}
}
for(int i=0;i<y;i++)
{
printf("%d ",queue[i]);
}
printf("\n");
}
总代码:
#include<stdio.h>
#include<stdlib.h>
#define msize 10
///双端队列的顺序表实现///
//双端队列用循环数组来实现。
//属性集合
int *queue;//数组放元素
int left,right;//分左右端指针
int maxsize;//当前最大数组尺寸
int size;//当前元素个数
void initqueue()
{//初始化
queue=(int*)malloc(sizeof(int)*msize);
maxsize=msize;
size=0;
left=right=0;
}
//操作4种:左边插入删除,右边插入删除
//左边
void insert_left(int k)
{
if(size==maxsize)
{
printf("满\n");//报错队满,失败或扩容
}
else
{
left--;//相当于前端延长
left=(left+maxsize)%maxsize;//防止出界
queue[left]=k;
size++;
}
}
void de_left()
{
int x;
if(size==0)
{
printf("空\n");//空,报错
}
else{
x=queue[left];
left=(left+1)%maxsize;
size--;
}
}
//右边
void insert_right(int k)
{
if(size==maxsize)
{
printf("满\n");//报错队满,失败或扩容
}
else
{
queue[right]=k;//先放入,再移动指针
right=(right+1) %maxsize;//right指向最右端元素的下一个位置
size++;
}
}
void de_right()
{
int x;
if(size==0)
{
printf("空\n");//空,报错
}
else{
right--;
right=(right+maxsize)%maxsize;
size--;
x=queue[right];
}
}
void printff()
{
int x=left;
int y=right;
//printf("%d\n",x);
if(x!=0)
{
for(int i=x;i<maxsize;i++)
{
printf("%d ",queue[i]);
}
}
for(int i=0;i<y;i++)
{
printf("%d ",queue[i]);
}
printf("\n");
}
int main()
{
initqueue();
insert_left(1);
insert_left(2);
insert_left(3);
insert_right(4);
insert_right(5);
printff();
//de_ri();
//
insert_right(6);
printff();
de_left();
de_left();
//de_left();
//de_right();
de_right();
de_right();
printff();
return 0;
}