双端队列的实现
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); }
相关文章推荐
- java数据结构之LinkedDeque(用链表实现的双端(即头尾两个哨兵节点)双向(node里两个指向)队列)
- 利用数组实现双端队列(C++)
- C++标准库__std::deque(双端队列),std::queue(队列),std::stack(栈)__由stl的定义我们就可以看出 queue和stack都是基于deque实现的和常用接口
- Java双端链表实现队列
- 利用顺序存储结构实现双端队列的入队和出队操作
- 双端队列实现分析
- 一种高效双端队列(链表)实现方式
- Java 模拟双端链表,以链表实现栈和队列
- 两个栈实现双端队列
- 双端队列链式实现完整代码
- 通过双端队列实现三维视频监控中的视频数据调度
- java实现双端队列
- 链表实现双端队列
- Java 实现双向链表,基于双向链表实现双端队列
- 用Python实现的数据结构与算法:双端队列
- java数据结构之LinkedDeque2(用链表实现的双端双向队列,addBack时调用节点的构造函数稍有不同)
- 双端队列(deque)链表实现
- 双端队列C实现很基础很经典——来自Redis
- 【算法导论】10.1-5单数组实现双端队列
- 用双端队列实现双端栈的底层实现,附有例子~