隊列的基本操做(鏈隊列)

隊列和棧差很少,惟一的區別就是棧式先進後出(FILO),隊列是先進先出(FIFO),隊列的示意圖以下ios

其基本操做的代碼以下spa

#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之間的關係,代碼中有的地方是結構體的"."(訪問),有的地方是"->"訪問,順序要搞清楚,否則會錯一片的!blog

相關文章
相關標籤/搜索