您的位置:首页 > 其它

双端队列的实现

2015-03-22 17:05 417 查看
原题:试采用一维数组实现循环的双端队列,即可以在任意一端入队列与出队列,并实现以下公操作:初始化、判空、求元素个数、入队列与出队列。分析:用tag(=1、2)来标识对哪一端操作,tag==1时对front端操作,tag==2时对rear端操作。

#include<iostream.h>
#include<stdlib.h>

typedef enum{FALSE,TRUE,OK,ERROR,OVER_FLOW}Status;
#define MAXSIZE 100		//存储空间最大容量
#define ElemType char
typedef struct
{
	ElemType elem[MAXSIZE];		//队列空间
	int front;		//队头
	int rear;		//队尾
}DuQueue;
void InitQueue(DuQueue &Q)
{//构造一个空的双端队列
	Q.front=Q.rear=0;
}
Status QueueEmpty(DuQueue Q)
{//判空函数,为空返回TRUE,否则返回FALSE
	if(Q.front == Q.rear)
	{
		cout<<"当前队列为空!"<<endl;
		return TRUE;		//Q.front==Q.rear时表示队列为空,返回true
	}
	else
	{
		cout<<"当前队列非空!"<<endl;
		return FALSE;		//否则返回false
	}
}
int QueueLength(DuQueue Q,int &length)
{//返回队列Q的元素个数
	length=(Q.rear-Q.front+MAXSIZE)%MAXSIZE;
	cout<<"当前队列长度为:"<<length<<endl;
	return length;
}
Status EnQueue(DuQueue &Q,ElemType e,int tag)
{//插入元素e到队列中,tag==1时插入到front端,否则插入到rear端
	if((Q.rear+1)%MAXSIZE == Q.front)
		return OVER_FLOW;		//队列已满,返回OVER_FLOW
	if((Q.front-1)%MAXSIZE == Q.rear)
		return OVER_FLOW;		//队列已满,返回OVER_FLOW
        else if(tag == 1)
	{//在front端插入
		Q.front=(Q.front-1+MAXSIZE)%MAXSIZE;
		Q.elem[Q.front]=e;		//Q.front指向队头元素
		return OK;		//插入成功
	}
	else if(tag == 2)
	{//在rear端插入
		Q.elem[Q.rear]=e;		//Q.rear指向虚单元
		Q.rear=(Q.rear+1)%MAXSIZE;
		return OK;		//插入成功
	}
	else
		return ERROR;		//tag非法,返回ERROR
}
Status DeQueue(DuQueue &Q,ElemType &e,int tag)
{//队列非空时出队列,tag==1时删除front端元素,tag==2时删除rear端元素,并用e返回其值
	if(QueueEmpty(Q)==TRUE)
		return ERROR;		//队列为空,返回ERROR
	else if(tag == 1)
	{//在front端出队
		e=Q.elem[Q.front];
		Q.front=(Q.front+1)%MAXSIZE;
		return OK;		//出队成功
	}
	else if(tag == 2)
	{//在rear端出队
		Q.rear=(Q.rear-1+MAXSIZE)%MAXSIZE;
		e=Q.elem[Q.rear];
		return OK;		//出队成功
	}
	else
		return ERROR;		//tag值非法,返回ERROR
}
Status DisplayDeQueue(DuQueue Q)
{//从队头到队尾逐个输出队列中的元素
	if(QueueEmpty(Q)==TRUE)
	{
		cout<<"当前队列为空!"<<endl;return ERROR;
	}
	while(Q.front!=Q.rear)
	{
		cout<<Q.elem[Q.front]<<" ";
		Q.front=(Q.front+1)%MAXSIZE;
	}
	cout<<endl;
	return OK;
}
void main()
{
	DuQueue Q;
	InitQueue(Q);
	int length;
	for(int i=0;i<10;i++)
	{//生成随机字母并将其入队列
		int flag=1;
		char e=rand()%26+'a';
		if(flag==rand()%2)
			EnQueue(Q,e,1);
		else
			EnQueue(Q,e,2);
	}
	DisplayDeQueue(Q);
	QueueLength(Q,length);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: