数据结构之双端队列的顺序表实现(C语言)

属性集合:

定义一个指针(数组)用来存放元素

定义左右指针

定义当前最大数组的尺寸

定义当前元素个数

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;
}






  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值