队列的简单实现(循环队列、链队)

循环队列的简单实现

#include<iostream>

#define MAXQSIZE 100
 
#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW   -2

using namespace std;

typedef int Status;

typedef struct
{
	int *base;
	int front;
	int rear;
}SqQueue;

Status InitQueue(SqQueue &Q)
{//初始化
    Q.base=new int[MAXQSIZE]; //为队列分配一个最大容量为MAXQSIZE的数组空间
    if(!Q.base)  exit(OVERFLOW);      //存储分配失败
    Q.front=Q.rear=0;                //头指针和尾指针置为零,队列为空
    return OK;
}      

Status QueueLength(SqQueue Q)
{//队列长度 
    return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}       

Status EnQueue(SqQueue &Q,int e)
{//入队 
    if((Q.rear+1) % MAXQSIZE == Q.front)    //队满
       return ERROR;
    Q.base[Q.rear]=e;                   //新元素插入队尾
    Q.rear=(Q.rear+1)%MAXQSIZE;         //队尾指针加1
    return OK;
 }     

Status DeQueue(SqQueue &Q,int &e)
{//出队 
    if(Q.front==Q.rear)  return ERROR;  //队空
    e=Q.base[Q.front];      //保存队头元素
    Q.front=(Q.front+1)%MAXQSIZE;       //队头指针加
    return OK;
}    

Status GetHead(SqQueue Q)
{//取队头元素 
     if(Q.front!=Q.rear)        //队列非空
        return Q.base[Q.front]; //返回队头元素的值,队头指针不变
}       

Status QueueEmpty(SqQueue Q)
{//判断队空 
	if(Q.front ==Q.rear )
	return OK;
	else
	return ERROR; 
} 

void ClearQueue(SqQueue &Q)
{//清除 
	if(Q.base) Q.front = Q.rear; 
}

void DetroyQueue(SqQueue &Q)
{//销毁 
	if(Q.base)
	{
		delete Q.base;
	}
}
int main()
{
	SqQueue Q;
	cout<<"简单实现循环队列:"<<endl;
	cout<<"初始化:"<<endl;
	if(InitQueue(Q))
	cout<<"初始化成功!"<<endl<<endl;
	else
	cout<<"初始化失败!"<<endl<<endl;
	
	cout<<"输入你想要几个元素入队:";
	int n,e,x;
	cin>>n;
	cout<<"输入这几个元素:";
	for(int i=1;i<=n;i++)
	{
		cin >> x;
		EnQueue(Q,x);
	}
	cout<<endl;
	
	cout<<"此时队列内的元素个数为:"<<QueueLength(Q)<<endl<<endl;
	 
	cout<<"删除队头元素:"<<endl;
	if(DeQueue(Q,e))
	cout <<"删除成功!"<<"这个元素是:"<<e<<endl<<endl;
	else
	cout<<"删除失败!"<<endl<<endl;
	
	cout<<"取队头元素:"<<GetHead(Q)<<endl<<endl;
	
	if(QueueEmpty(Q))
	cout<<"循环队列为空!"<<endl<<endl;
	else
	cout<<"循环队列不为空!"<<endl<<endl;
	
	cout<<"此时队列内的元素个数为:"<<QueueLength(Q)<<endl<<endl;
	
	cout<<"清除队列:"<<endl;
	ClearQueue(Q);
	cout <<"已清除!"<<"此时队列内的元素个数为:"<<QueueLength(Q)<<endl<<endl;
	
	if(QueueEmpty(Q))
	cout<<"循环队列为空!"<<endl<<endl;
	else
	cout<<"循环队列不为空!"<<endl<<endl;
	
	cout<<"销毁队列:"<<endl;
	DetroyQueue(Q);
	cout<<"已销毁!";
	return 0;	
}

在这里插入图片描述


链队的简单实现

#include<iostream>
 
#define TRUE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW   -2

using namespace std;

typedef int Status;

typedef struct QNode
{
	int data;
	struct QNode *next;
}QNode, *QueuePtr;
typedef struct
{
	QueuePtr front; //队头指针 
	QueuePtr rear;  //队尾指针
}LinkQueue;

Status InitQueue(LinkQueue &Q)
{//初始化
    Q.front=Q.rear=new QNode;  //生成新结点作为头结点,队头和队尾指针指向此结点
    Q.front->next=NULL;   //头结点的指针域置空
    return OK;
}    

Status EnQueue(LinkQueue &Q,int e)
{//入队
     QueuePtr p;
     p=new QNode;  //为入队元素分配结点空间,用指针p指向
     p->data=e;    //将新结点的数据域置为e
     p->next=NULL; Q.rear->next=p;  //将新结点插入到队尾
     Q.rear=p;     //修改队尾指针
     return OK;
}     

Status DEQueue(LinkQueue &Q,int &e)
{//出队 
     QueuePtr p;
     if(Q.front==Q.rear)  return ERROR;  //队列空
     p=Q.front->next;                    //p指向队头元素
     e=p->data;                          //e保存队头元素的值
     Q.front->next=p->next;              //修改头结点的指针域
     if(Q.rear==p) Q.rear=Q.front;       //最后一个元素被删,队尾指针指向头结点
     delete p;                           //释放原队头元素空间
     return OK;
}     

Status GetHead(LinkQueue Q)
{//取队头元素 
    if(Q.front!=Q.rear)    //队列非空
      return Q.front->next->data;  //返回队头元素的值,队头指针不变
}    

Status EmptyQueue(LinkQueue Q)
{//判断是否为空 
	if(Q.front==Q.rear)
	return OK;
	else
	return ERROR;
} 

Status LengthQueue(LinkQueue Q)
{//队内元素个数 
	int len=0;
	QueuePtr p=Q.front;
	while(p->next!=NULL)
	{
		p=p->next;
		len++;
	}
	return len;
}

void ClearQueue(LinkQueue &Q)
{//清空 
	if(Q.front)
	Q.front->next =NULL;
}

void DestroyQueue(LinkQueue &Q)
{//销毁 
	QueuePtr p;
	while(Q.front)
	{
		p=Q.front->next;
		delete Q.front; 
		Q.front=p;
	}
}

int main()
{
	LinkQueue Q;
	cout<<"链队的简单实现:"<<endl;
	cout<<"初始化:"<<endl;
	if(InitQueue(Q))
	cout <<"初始化成功!"<<endl<<endl;
	else
	cout <<"初始化失败!"<<endl<<endl;
	
	cout<<"输入你想让几个元素入队:";
	int n,x;
	cin >> n;
	cout<<"输入这几个元素:";
	for(int i=0;i<n;i++)
	{
		cin>>x;
		EnQueue(Q,x);
	}
	cout<<endl;
	
	int e;
	cout<<"删除队头元素:"<<endl;
	if(DEQueue(Q,e))
	cout <<"删除成功!"<<"这个元素是:"<<e<<endl<<endl;
	else
	cout<<"删除失败!"<<endl<<endl;
	
	if(EmptyQueue(Q))
    cout <<"链队空!"<<endl<<endl;
	else
	cout<<"链队非空!"<<endl<<endl;	
	
	cout<<"队内元素个数为:"<<LengthQueue(Q)<<endl<<endl;
	
	cout<<"取队头元素:"<<GetHead(Q)<<endl<<endl;
	
	cout<<"清除链队:"<<endl;
	ClearQueue(Q);
	cout <<"已清除!"<<"此时元素个数为:"<< LengthQueue(Q)<<endl<<endl;
	
	cout<<"销毁链队:"<<endl;
	DestroyQueue(Q);
	cout<<"已销毁!";
	 return 0;	
 } 

在这里插入图片描述

发布了34 篇原创文章 · 获赞 88 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wmy0217_/article/details/104208971