队列
顺序队列
判断条件:
1 2 3
   | Q.front=Q.rear=0//队空 队满判断不能简单的定义为Q.rear==Maxsize 执行多次的入队出队操作后 会出现Q.front=Q.rear-1;Q.rear=Maxsize  即为队列中只有队尾有一个元素 出现"上溢出" 但这个溢出并不是真正的溢出 队列中还有空位置所以是"假溢出"
   | 
 
循环队列
判断条件:
1 2 3 4 5 6
   | Q.front=Q.rear=0 Q.front=(Q.rear+1)%Maxsize Q.front=Q.rear Q.rear=(Q.rear+1)%Maxsize Q.front=(Q.front+1)%Maxsize length=(Q.rear-Q.front+Maxsize)%Maxsize
   | 
 
牺牲最后一个存储单元 防止队列满时front与rear指向同一个元素导致无法判断是队列空还是满
所以队列满的条件为 rear就在front后面的存储单元
能够存储的元素数量为Maxsize-1
 
具体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
   |  using namespace std;
  typedef char ElemType;  typedef struct { 	ElemType *data;//队列元素  	int front,rear;//头指针与尾指针  }SqQueue; bool InitQueue(SqQueue &Q)//初始化空队列Q  { 	Q.data = new ElemType[Maxsize]; 	if(!Q.data) return 0; 	Q.front=Q.rear=0;//头指针等于尾指针是队列为空的标志  	return 1; } bool EnQueue(SqQueue &Q,ElemType e)//入队  { 	if((Q.rear+1)%Maxsize==Q.front) return 0;//队满  	Q.data[Q.rear]=e; 	Q.rear=(Q.rear+1)%Maxsize;//队尾指针+1取模=向后移位  	return 1; } bool DeQueue(SqQueue &Q,ElemType &e)//出队  { 	if(Q.front==Q.rear) return 0;//队空  	e=Q.data[Q.front]; 	Q.front=(Q.front+1)%Maxsize;//队首指针+1取模=向后移位  	return 1; } bool QueueLength(SqQueue Q)//循环队列长度  { 	cout<<(Q.rear-Q.front+Maxsize)%Maxsize; } void ShowQueue(SqQueue Q) { 		int i=Q.front; 		while(i!=Q.rear) 		{ 			cout<<Q.data[i]<<" "; 			i=(i+1)%Maxsize; 		} 	cout<<endl; } int main() { 	SqQueue Q; 	int i,j,m,n; 	ElemType e; 	if(!InitQueue(Q)) cout<<"循环队列初始化失败"<<endl; 	cout<<"请输入要入队的元素个数 个数不能大于5否则入队失败"<<endl; 	cin>>j; 	for(i=1;i<=j;i++) 	{ 		cout<<"请输入要入队的元素"<<endl; 		cin>>e; 		EnQueue(Q,e);  	} 	cout<<"元素入队成功"<<endl; 	do 	{ 		cout<<"请输入对应功能的数字: 1.入队 2.出队 3.求循环队列长度 4.显示队列元素 "<<endl; 		cin>>m; 		switch(m) 		{ 			case 1: 				{ 					cout<<"请输入入队的元素"<<endl; 					cin>>e; 					EnQueue(Q,e); 					break; 				} 			case 2: 				{ 					DeQueue(Q,e); 					cout<<"删除成功"<<endl; 					break; 				} 			case 3: 				{ 					cout<<"队列长度为"; 					QueueLength(Q); 					cout<<endl; 					break; 				} 			case 4: 				{ 					cout<<"显示队列的元素"<<endl; 					ShowQueue(Q); 					break; 				}			 		} 		cout<<"是否继续执行操作 1.继续 2.退出"<<endl; 		cin>>n; 	}while(n==1); 	return 0; }
 
  | 
 
链式队列
顾名思义 链式队列就是同时带有头指针和尾指针的单链表
头指针指向队头结点 尾指针指向队尾结点 即单链表最后一个结点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
   |  using namespace std; typedef char ElemType;  typedef struct LNode { 	ElemType data; 	struct LNode *next;//next指向struct Lnode结构体变量  }LNode,*LinkNode;//结构体类型LNode 别名为*LinkNode  typedef struct{ 	LNode *front,*rear; }LinkQueue; bool InitQueue(LinkQueue &Q){//初始化  	Q.front=Q.rear=new LNode;       Q.front->next=NULL;   	return 1; } bool EnQueue(LinkQueue &Q,ElemType e)//入列  { 	LNode *p=new LNode; 	p->data=e; 	p->next=NULL; 	Q.rear->next=p; 	Q.rear=p; } bool DeQueue(LinkQueue &Q,ElemType &e)//出队  { 	if(Q.front==Q.rear) return 0; 	LNode *p=new LNode; 	p=Q.front->next; 	e=p->data; 	Q.front->next=p->next; 	if(Q.rear==p) Q.rear=Q.front; 	delete p; 	return 1;  } int DestroyQueue(LinkQueue &Q,ElemType &e)//销毁链队列  { 	while(!InitQueue(Q)) 	{   		DeQueue(Q,e); 	} 	delete Q.front;       Q.front=Q.rear=NULL;     return 1; } void DispQueue(LinkQueue Q)//显示链队列元素  { 	LNode *p=new LNode; 	LNode *q=new LNode; 	if(Q.rear==NULL) cout<<"队列为空"<<endl; 	else 	{ 		p=Q.front->next; 		q=Q.rear; 		while(p!=NULL) 			{ 				cout<<p->data<<" "; 				p=p->next; 			}  			cout<<endl; 	} }  int main() { 	LinkQueue Q; 	int i,j,m,n; 	ElemType e; 	if(!InitQueue(Q)) cout<<"链队初始化失败"<<endl; 	cout<<"请输入要入队的元素个数"<<endl; 	cin>>j; 	for(i=1;i<=j;i++) 	{ 		cout<<"请输入要入队的元素"<<endl; 		cin>>e; 		EnQueue(Q,e);  	} 	cout<<"元素入队成功"<<endl; 	do 	{ 		cout<<"请输入对应功能的数字: 1.入队 2.出队 3.销毁链队列 4.显示队列元素 "<<endl; 		cin>>m; 		switch(m) 		{ 			case 1: 				{ 					cout<<"请输入入队的元素"<<endl; 					cin>>e; 					EnQueue(Q,e); 					break; 				} 			case 2: 				{ 					DeQueue(Q,e); 					cout<<"删除成功"<<endl; 					break; 				} 			case 3: 				{ 					if(!DestroyQueue(Q,e)) cout<<"销毁失败"<<endl; 					else cout<<"销毁成功"<<endl;  					break; 				} 			case 4: 				{ 					cout<<"显示队列的元素"<<endl; 					DispQueue(Q); 					break; 				}			 		} 		cout<<"是否继续执行操作 1.继续 2.退出"<<endl; 		cin>>n; 	}while(n==1); 	return 0; }
 
 
  |