//队列实验题
#include<iostream>
#include<malloc.h>
using namespace std;
#define Status int
#define QElemType char
#define OVERFLOW 0
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q);//初始化
Status QueueEmpty(LinkQueue Q);//判断是否为空
Status DestroyQueue(LinkQueue &Q);//销毁队列
Status EnQueue(LinkQueue &Q,QElemType e);//进入一个元素
Status DeQueue(LinkQueue &Q,QElemType &e);//出一个元素
Status PrintQueue(LinkQueue Q);//输出所有元素
Status QueueLength(LinkQueue Q);//获取队列长度
void main()
{
LinkQueue Q;//定义一个队列
InitQueue(Q);//初始化一下
//判断是否为空
if(QueueEmpty(Q))
cout<<"The queue is Empty"<<endl;
//abc进入了
EnQueue(Q,'a');
EnQueue(Q,'b');
EnQueue(Q,'c');
cout<<"a,b,c enter the queue"<<endl;
QElemType s='\0';
//队头出来了,存进了s中
DeQueue(Q,s);
cout<<"\'"<<s<<"\'come out of the queue"<<endl;
//def进入了
EnQueue(Q,'d');
EnQueue(Q,'e');
EnQueue(Q,'f');
cout<<"d,e,f enter the queue"<<endl;
//输出队列里面的元素
PrintQueue(Q);
}
Status InitQueue(LinkQueue &Q)//初始化
{
//构造一个空的队列Q
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front) exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
Status DestroyQueue(LinkQueue &Q)//释放所有空间
{
//销毁队列Q
while(Q.front)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return OK;
}
Status EnQueue(LinkQueue &Q,QElemType e)
{
//插入元素e为Q的新的队尾元素
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
Status DeQueue(LinkQueue &Q,QElemType &e)
{
//若队列不为空,则删除队列的队头元素,用e返回其值,并返回ok
//否则返回ERROR
QueuePtr p;
if(Q.front==Q.rear)
return ERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return OK;
}
Status QueueEmpty(LinkQueue Q)
{
if(Q.front==Q.rear)
return TRUE;
return FALSE;
}
Status PrintQueue(LinkQueue Q)
{
QueuePtr p;
if(Q.front==Q.rear)//如果为空那么返回错误
return ERROR;
p=Q.front;//先放置在头结点
while(p!=Q.rear)
{
p=p->next;
cout<<p->data;
}
return OK;
}
Status QueueLength(LinkQueue Q)
{
QueuePtr p;
if(Q.front==Q.rear)//如果为空那么返回0
return 0;
p=Q.front;//先放置在头结点
int Len=0;
while(p!=Q.rear)
{
p=p->next;
Len++;
}
return Len;
}