隊列和棧差不多,唯一的區別就是棧式先進后出(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之間的關系,代碼中有的地方是結構體的"."(訪問),有的地方是"->"訪問,順序要搞清楚,不然會錯一片的!
