_DataStructure_C_Impl:双端队列

//_DataStructure_C_Impl:双端队列
#include<stdio.h>
#include<stdlib.h>
#define QueueSize 8		//定义双端队列的大小
typedef char DataType;
typedef struct DQueue{	//双端队列的类型定义
	DataType queue[QueueSize];
	int end1,end2;		//双端队列的队尾指针
}DQueue;
//将元素e插入到双端队列中。如果成功返回1,否则返回0
int EnterQueue(DQueue *DQ,DataType e,int tag){
	switch(tag){
	case 1:		//1表示在队列的左端入队
		if(DQ->end1!=DQ->end2){		//元素入队之前判断队列是否为满
			DQ->queue[DQ->end1]=e;	//元素e入队
			DQ->end1=(DQ->end1-1)%QueueSize;	//向左移动队列指针
			return 1;
		}else
			return 0;
	case 2:				//2表示在队列的右端入队
		if(DQ->end1!=DQ->end2){
			DQ->queue[DQ->end2]=e;
			DQ->end2=(DQ->end2+1)%QueueSize;	//向右移动队列指针
			return 1;
		}else
			return 0;
	}
	return 0;
}
//将元素出队列,并将出队列的元素赋值给e。如果出队列成功返回1,否则返回0
int DeleteQueue(DQueue *DQ,DataType *e,int tag){
	switch(tag){
	case 1:		//1表示在队列的左端出队
		if(((DQ->end1+1)%QueueSize)!=DQ->end2){		//在元素出队列之前判断队列是否为空
			DQ->end1=(DQ->end1+1)%QueueSize;		//向右移动队列指针,将元素出队列
			*e=DQ->queue[DQ->end1];			//将出队列的元素赋值给e
			return 1;
		}else
			return 0;
	case 2:
		if(((DQ->end2-1)%QueueSize)!=DQ->end1){
			DQ->end2=(DQ->end2-1)%QueueSize;		//向左移动队列指针,将元素出队列
			*e=DQ->queue[DQ->end2];
			return 1;
		}else
			return 0;
	}
	return 0;
}
void main(){
	DQueue Q;			/*定义双端队列Q*/
	char ch;			/*定义字符*/
	Q.end1=3;			/*设置队列的初始状态*/
	Q.end2=4;
	/*将元素a,b,c在队列左端入队*/
	if(!EnterQueue(&Q,'a',1))			/*元素左端入队*/
		printf("队列已满,不能入队!");
	else
		printf("a左端入队:\n");
	if(!EnterQueue(&Q,'b',1))
		printf("队列已满,不能入队!");
	else
		printf("b左端入队:\n");
	if(!EnterQueue(&Q,'c',1))
		printf("队列已满,不能入队!");
	else
		printf("c左端入队:\n");
	/*将元素d,e在队列右端入队*/
	if(!EnterQueue(&Q,'d',2))			/*元素右端入队*/
		printf("队列已满,不能入队!");
	else
		printf("d右端入队:\n");
	if(!EnterQueue(&Q,'e',2))
		printf("队列已满,不能入队!");
	else
		printf("e右端入队:\n");
	/*元素c,b,e,d依次出队列*/
	printf("队列左端出队一次:");
	DeleteQueue(&Q,&ch,1);				/*元素左端出队列*/
	printf("%c\n",ch);
	printf("队列左端出队一次:");
	DeleteQueue(&Q,&ch,1);
	printf("%c\n",ch);
	printf("队列右端出队一次:");
	DeleteQueue(&Q,&ch,2);				/*元素右端出队列*/
	printf("%c\n",ch);
	printf("队列右端出队一次:");
	DeleteQueue(&Q,&ch,2);
	printf("%c\n",ch);
	system("pause");
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 01:05:28

_DataStructure_C_Impl:双端队列的相关文章

8、泛型程序设计与c++标准模板库2.3双端队列容器

双端队列容器是一种放松了访问权限的队列.除了从队列的首部和尾部访问元素外,标准的双端队列也支持通过使用下标操作符"[]"进行直接访问. 它提供了直接访问和顺序访问方法.其头文件为<deque>. 1)双端队列容器的构造函数 有4中形式的构造函数: deque();//构造size()为0的双端队列容器 deque(size_type n,const T& v=T());//初始化大小为n的双端队列,第二个参数是每个元素的初始值,默认为T()构造的对象 deque(c

习题3.26双端队列

#include<stdio.h> #include<stdlib.h> struct Node; struct Queue; typedef struct Node * PtrToNode; typedef struct Queue * PtrToQ; struct Node{ PtrToNode Pre; PtrToNode Next; ElemenType Ele; } struct Queue{ PtrToNode front; PtrToNode rear; }; Ptr

nyoj1117 鸡蛋队列 (双端队列,deque)

题目1117 题目信息 运行结果 本题排行 讨论区 鸡蛋队列 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 将两根筷子平行的放在一起,就构成了一个队列.将带有编号的鸡蛋放到两根筷子之间叫做入队(push),将筷子之间的鸡蛋拿出来叫做出队(pop).但这两种方式有特殊的定义,对于入队,只能将鸡蛋从队列的尾部向里放入:对于出队,只能将鸡蛋从队列的头部向外将鸡蛋拿出来. 将①.②入队: 头____________尾                         ___

算法导论之八(10.1-5单数组实现双端队列)

算法导论第三版P131 题目: 10.1-5 栈插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行.写出4个时间均为O(1)的过程,分别实现在双端队列插入和删除元素的操作,该队列使用一个数组实现的. 注意点: 1.左右端点指向的位置是类似于队列中的tail端点,是下一个插入操作的位置. 2.然后注意遍历的时候,左端点和右端点的位置关系,有两种可能,所以遍历的方式不一样. 代码: /* * 使用单数组

HDU 4286 Data Handler (双端队列)

Data Handler Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2455    Accepted Submission(s): 616 Problem Description You are in charge of data in a company, so you are called "Data Handler&qu

队列的应用:双端队列

双端队列(Deque:double ended queue)就是一个两端都是结尾的队列.队列的每一端都可以插入数据项和移除数据项.相对于普通队列,双端队列的入队和出队操作在两端都可进行. 双端队列的示意图: left:左端    right:右端 这里我们使用最常用的顺序结构来存储双端队列,为了节省空间,把它首尾相连,构成循环队列.并且规定left指向左端的第一个元素,right指向右端的下一个位置.那么队空的判断则是left==right,队满是(left-1+MAX)%MAX==right或

hdu-5929 Basic Data Structure(双端队列+模拟)

题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 207    Accepted Submission(s): 41 Problem Description Mr. Frog learned a basic data structure recently, which is called

Vijos1834 NOI2005 瑰丽华尔兹 动态规划 单调双端队列优化

设dp[t][x][y]表示处理完前t个时间段,钢琴停留在(x,y)处,最多可以走多少个格子 转移时只需逆着当前倾斜的方向统计len个格子(len为时间区间的长度,len=t-s+1),如果遇到障碍就中断 转移过程可以用单调非递增的双端队列优化 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int maxN=202; 6 const int inf=0x3f3f3f3f

补番计划 (长沙理工大学第十一届程序设计竞赛)(双端队列+set容器+string)

补番计划 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 8   Accepted Submission(s) : 1 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 阿聪是一个日漫狂魔.暑假在家的时候,他有12小时在补番,12小时在睡