双端队列的实现

原题:试采用一维数组实现循环的双端队列,即可以在任意一端入队列与出队列,并实现以下公操作:初始化、判空、求元素个数、入队列与出队列。分析:用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);
}



/* * 基于双向链表实现双端队列结构 */ package dsa; public class Deque_DLNode implements Deque { protected DLNode header;//指向头节点(哨兵) protected DLNode trailer;//指向尾节点(哨兵) protected int size;//队列中元素的数目 //构造函数 public Deque_DLNode() { header = new DLNode(); trailer = new DLNode(); header.setNext(trailer); trailer.setPrev(header); size = 0; } //返回队列中元素数目 public int getSize() { return size; } //判断队列是否为空 public boolean isEmpty() { return (0 == size) ? true : false; } //取首元素(但不删除) public Object first() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return header.getNext().getElem(); } //取末元素(但不删除) public Object last() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return trailer.getPrev().getElem(); } //在队列前端插入新节点 public void insertFirst(Object obj) { DLNode second = header.getNext(); DLNode first = new DLNode(obj, header, second); second.setPrev(first); header.setNext(first); size++; } //在队列后端插入新节点 public void insertLast(Object obj) { DLNode second = trailer.getPrev(); DLNode first = new DLNode(obj, second, trailer); second.setNext(first); trailer.setPrev(first); size++; } //删除首节点 public Object removeFirst() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = header.getNext(); DLNode second = first.getNext(); Object obj = first.getElem(); header.setNext(second); second.setPrev(header); size--; return(obj); } //删除末节点 public Object removeLast() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = trailer.getPrev(); DLNode second = first.getPrev(); Object obj = first.getElem(); trailer.setPrev(second); second.setNext(trailer); size--; return(obj); } //遍历 public void Traversal() { DLNode p = header.getNext(); while (p != trailer) { System.out.print(p.getElem()+" "); p = p.getNex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值