队列……

应该是 循环队列比较有用吧…… 🙂 

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#define ll long long
#define queue_size 100
#define queueincrement 10
#define Qelemtype int
#define Status int
#define False 0
#define OK 1
using namespace std;
typedef struct Qnode
{
	Qelemtype data;
	struct Qnode *next;
}Qnode,*QueuePtr;
//*Queueptr是指定义了一个可以指向结构体Qnode的指针,
typedef struct {
	QueuePtr front;//队头指针 
	QueuePtr rear;//队尾指针 
}sq_queue;
//初始化 
Status Init_queue(sq_queue *Q)
{
	Q->front= Q->rear = (QueuePtr)malloc(sizeof(Qnode)); //申请空间 
	if(Q->front == NULL) return False;
	Q->front->next=NULL;
	return OK;
}

//销毁 
Status Destory_queue(sq_queue *Q)
{
	while(Q->front)//画图理解。 
	{
		Q->rear=Q->front->next;
		free(Q->front);
		Q->front=Q->rear;
	}
	return OK;
}


//判断是否为空 
Status Empty_queue(sq_queue Q)
{
	if(Q.front==Q.rear)
	return OK;
	else return False;
}

//清空 
Status Clear_queue(sq_queue *Q)
{
	if(Empty_queue(*Q)) return OK;//空队列就不需要清空了 
	QueuePtr pre,p;
	p=Q->front->next;//头 
	Q->front->next=NULL;
	Q->rear=Q->front;//移动尾指针到头指针处 利用p 进行队列头指针之后的结点删除  
	while(p)
	{
		pre=p->next;
		free(p);
		p=pre;
	}
	return OK;
}

//队列的长度 
Status Length_queue(sq_queue Q)
{
	int len=0;
	if(!Empty_queue(Q))
	{
		QueuePtr s=(QueuePtr)malloc(sizeof(Qnode));
		s=Q.front->next;
		while(s)
		{
			s=s->next;
			len++;
		}
		return len;
	}else return False;
}


//队头元素 
Status Gethead_queue(sq_queue Q,Qelemtype *e)
{
	if(!Empty_queue(Q))
	{
		*e=(Q.front->next->data);	
		return OK;	
	}else return False;

} 

//尾进 
Status Insert_queue(sq_queue *Q,Qelemtype e)
{
	QueuePtr s=(QueuePtr)malloc(sizeof(Qnode));
	if(!s) return False;//内存分配失败
	s->data=e;
	s->next=NULL;
	Q->rear->next=s;//把新结点插入队尾 
	Q->rear=s;//把新结点设为队尾结点
	return OK; 
}

//头出 并返回其值 
Status Delete_queue(sq_queue *Q,Qelemtype *e)
{
	if(!Empty_queue(*Q))
	{
		QueuePtr p=Q->front->next;//p指向要出队的结点 
		*e=p->data;//值 
		Q->front->next=p->next;  
		if(Q->rear==p)
			Q->rear=Q->front;//队头就是队尾 则删除后队尾指向队头
		free(p); 
	}else return False;	
}

//遍历
void Traverse_queue(sq_queue Q)
{
	QueuePtr s;
	s=Q.front->next;
	while(s!=NULL)
	{
		cout<< s->data <<" ";
		s=s->next;
	}
	cout<<endl;
}
int main()
{
	sq_queue Q;
	Qelemtype e;
	if(!Init_queue(&Q))//分配内存失败 
	{
		cout<<"Memory allocation failed!"<<endl;
		return 0;
	}
	else{
			for(int i=1;i<=20;i++)
			{
				int a=rand()%10+1;
				Insert_queue(&Q,a);
			}
			cout<<"Length of queue: ";
			cout<<Length_queue(Q)<<endl;
			cout<<"Queue: ";
			Traverse_queue(Q);//验证 
			
			cout<<"The number of front: ";
			Gethead_queue(Q,&e);//头 
			cout<<e<<endl;
			
			//出 
			int flag=1;
			char c; 
			while(flag)
			{
				cout<<"Pop_front: ";
				if(Delete_queue(&Q,&e))
				cout<<e<<endl;
				else {
					cout<<"Error"<<endl;
					break;
				}
				cout<<"Continuing??(Y or N) ";
				cin>>c;
				if(c=='Y'||c=='y') flag=1;
				else flag=0;	
			}
			//进 
			int flag1=1;
			char c1; 
			while(flag1)
			{
				cout<<"Input number you push_rear: ";
				cin>>e;
				Insert_queue(&Q,e);
				cout<<"After pushing: "; 
				Traverse_queue(Q);
				
				cout<<"continuing??(Y or N) ";
				cin>>c1;
				if(c1=='Y'||c1=='y') flag1=1;
				else flag1=0;	
			}
			
			cout<<"Clear…i…n…g…"<<endl; 
			//清空
			Clear_queue(&Q);
			if(Empty_queue(Q)) cout<<"Clear accomplished..."<<endl;
			else cout<<"Clear failed"<<endl; 
			//销毁 
			if(Destory_queue(&Q)) cout<<"Destory accomplished..."<<endl;
	}

	return 0;
}

/*如果你使用的变量x是个结构体,应该用.访问其成员,如:x.num
如果你使用的变量x是个结构体指针,应该用->访问其成员,如:x->num*/

循环 队列

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#define ll long long
#define Max_size 10
#define Qelemtype int
#define Status int
#define False 0
#define OK 1
using namespace std;
typedef struct 
{
	Qelemtype *data;
	int front,rear;//头、尾。 如果队列不满的话,尾指向队列尾元素的下一个位置~ 
 }sq_queue;
 
//初始化 
Status Init_queue(sq_queue *Q)
{
 	Q->data = (Qelemtype *)malloc(Max_size*sizeof(Qelemtype)); 
 	if(Q->data==NULL) return False;
 	Q->front=0;
 	Q->rear=0;
 	return OK;
} 
//销毁 
Status Destory_queue(sq_queue *Q)
{
	if(Q->data) free(Q->data);//malloc free 配套使用 
	Q->data=NULL;
	Q->front=Q->rear=0;
	return OK;
}

//清空
Status Clear_queue(sq_queue *Q)
{
	Q->front=Q->rear=0;
	return OK; 
}
//判断是否为空 
Status Empty_queue(sq_queue Q)
{
	if(Q.rear==Q.front)
	return OK;
	return False;
}
//长度 
Status Length_queue(sq_queue Q)
{
	return (Q.rear-Q.front+Max_size)%Max_size;
}

//队头元素 
Status Gethead_queue(sq_queue Q,Qelemtype *e)
{
	if(!Empty_queue(Q))
	{
		*e=Q.data[Q.front];	
		return OK;	
	}else return False;

} 

//在队尾插入元素 
Status Insert_queue(sq_queue *Q,Qelemtype e)
{
	if((Q->rear+1)%Max_size==Q->front)//满 
	{
		return False;
	}
	Q->data[Q->rear]=e;
	Q->rear=(Q->rear+1)%Max_size;//注意下一个位置。 
	return OK;
}
//队首删除 
Status Delete_queue(sq_queue *Q,Qelemtype *e)
{
	if(Empty_queue(*Q))
		return False;
	*e=Q->data[Q->front];
	Q->front=(Q->front+1)%Max_size;
	return OK;
}

//遍历 
void Traverse_queue(sq_queue Q)
{
	if(Empty_queue(Q)) 
	cout<<"error"<<endl;
	else
	{
		for(int i=Q.front;i<Q.rear;i++)
		{
			cout<<Q.data[i]<<"  ";
		}
		cout<<endl;
	}
}
int main()
{
	Qelemtype e;
	sq_queue Q;
	if(!Init_queue(&Q))//分配内存失败 
	{
		cout<<"Memory allocation failed!"<<endl;
		return 0;
	}
	else
	{
		for(int i=1;i<=5;i++)//Max_size 为10  当 数据数量为 9 时 即 full 
		{
			int a=rand()%10+1;
			Insert_queue(&Q,a);
	 	} 
	 
		cout<<"Length of queue: ";
		cout<<Length_queue(Q)<<endl;
	
		cout<<"Queue: ";
		Traverse_queue(Q);//检验队列 
	
		cout<<"The head element: ";
		Gethead_queue(Q,&e);
		cout<<e<<endl;
		
		//插入  进 
		int flag1=1;
		char c1; 
		while(flag1)
		{
			cout<<"Input number you push_rear: ";
			cin>>e;
			if(Insert_queue(&Q,e))
			{
				cout<<"After pushing: "; 
				Traverse_queue(Q);	
			}else
			{
				cout<<"The queue is full~"<<endl;
				break;
			}
			
			cout<<"Continuing??(Y or N) ";
			cin>>c1;
			if(c1=='Y'||c1=='y') flag1=1;
			else flag1=0;	
		}
		
		//删除  出 
		int flag=1;
		char c; 
		while(flag)
		{
			cout<<"Pop_front: ";
			if(Delete_queue(&Q,&e))
			cout<<e<<endl;
			else {
				cout<<"None"<<endl;
				break;
			}
			cout<<"Continuing??(Y or N) ";
			cin>>c;
			if(c=='Y'||c=='y') flag=1;
			else flag=0;	
		} 
		
		cout<<"Clear…i…n…g…"<<endl; 
		//清空
		Clear_queue(&Q);
		if(Empty_queue(Q)) cout<<"Clear accomplished..."<<endl;
		else cout<<"Clear failed"<<endl;
		//销毁 
		if(Destory_queue(&Q)) cout<<"Destory accomplished..."<<endl;
	}
	 return 0;
}

 


年轻也需要有所作为( ・´ω`・ )