队列和栈差不多,唯一的区别就是栈式先进后出(FILO),队列是先进先出(FIFO),队列的示意图如下
其基本操作的代码如下
#include<iostream>
#include<cstdlib>
using namespace std;
struct QNode{
int data;
QNode *next;
};
typedef QNode *QueuePtr;
struct LinkQueue{
QueuePtr front;
QueuePtr rear;
};
//初始化队列
bool InitQueue(LinkQueue &Q){
Q.front=Q.rear=new QNode;
if(!Q.front){
cout<<"初始化失败"<<endl;
return false;
}
Q.front->next=NULL;
cout<<"初始化成功"<<endl;
return true;
}
//销毁队列
void DestroyQueue(LinkQueue &Q){
while(Q.front){
Q.rear=Q.front->next;
delete (Q.front);
Q.front=Q.rear;
}
cout<<"队列已被销毁"<<endl;
}
//判断是否为空
bool EmptyQueue(LinkQueue Q){
if(Q.front==Q.rear){
cout<<"队列为空"<<endl;
return true;
}
cout<<"队列不为空"<<endl;
return false;
}
//入队
void EnQueue(LinkQueue &Q,int value){
QueuePtr p=new QNode;
p->data=value;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
cout<<value<<" 已经入队"<<endl;
}
//出队(一)
void DeQueue(LinkQueue &Q,int &value){
if(Q.front==Q.rear){
cout<<"队列为空"<<endl;
return;
}
QueuePtr p=Q.front->next;
//vlaue保存被删的结点数据
value=p->data;
Q.front->next=p->next;
if(Q.rear==p){//如果p指向的是尾结点
Q.rear=Q.front;
}
delete p;
cout<<value<<" 已经出队"<<endl;
}
//出队(二)
void DeQueue2(LinkQueue &Q,int &value){
if(Q.front==Q.rear){
cout<<"队列为空"<<endl;
return;
}
QueuePtr p=Q.front;
Q.front=Q.front->next;
value=p->data;
delete p;
cout<<value<<" 已经出队"<<endl;
}
//队列元素个数
void GetLength(LinkQueue Q,int &length){
length=0;
QueuePtr p=Q.front;
while(p!=Q.rear){
p=p->next;
length++;
}
cout<<"队列元素个数"<<length<<"个"<<endl;
}
//显示队列元素
void VisitQueue(LinkQueue Q){
if(Q.front==Q.rear){
cout<<"队列为空"<<endl;
return;
}
QueuePtr p=Q.front;
while(p!=Q.rear){
p=p->next;
cout<<p->data<<" ";
}
cout<<endl;
}
void show(){
cout<<"+----------------------------------+"<<endl;
cout<<"| |"<<endl;
cout<<"| 1->初始化队列 |"<<endl;
cout<<"| 2->判断队列是否为空 |"<<endl;
cout<<"| 3->入队 |"<<endl;
cout<<"| 4->出队 |"<<endl;
cout<<"| 5->显示队列元素 |"<<endl;
cout<<"| 6->销毁队列 |"<<endl;
cout<<"| 7->队列元素个数 |"<<endl;
cout<<"| |"<<endl;
cout<<"+----------------------------------+"<<endl;
}
int main(){
LinkQueue Q;
int action,value,length;
show();
while(cin>>action){
switch(action){
case 1:
system("cls");
InitQueue(Q);
break;
case 2:
system("cls");
EmptyQueue(Q);
break;
case 3:
system("cls");
cout<<"请输入入队的元素"<<endl;
cin>>value;
EnQueue(Q,value);
break;
case 4:
system("cls");
DeQueue(Q,value);
break;
case 5:
system("cls");
VisitQueue(Q);
break;
case 6:
system("cls");
DestroyQueue(Q);
break;
case 7:
system("cls");
GetLength(Q,length);
}
system("pause");
system("cls");
show();
}
}
一定要注意LinkQueue,QueuePtr,QNode之间的关系,代码中有的地方是结构体的"."(访问),有的地方是"->"访问,顺序要搞清楚,不然会错一片的!