队列的基本操作(链队列)
队列和栈差不多,唯一的区别就是栈式先进后出(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之间的关系,代码中有的地方是结构体的"."(访问),有的地方是"->"访问,顺序要搞清楚,不然会错一片的!
如需转载,请注明文章出处,谢谢!!!