• 队列的基本操作(链队列)


    队列和栈差不多,唯一的区别就是栈式先进后出(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之间的关系,代码中有的地方是结构体的"."(访问),有的地方是"->"访问,顺序要搞清楚,不然会错一片的!

  • 相关阅读:
    使用crontab定时执行脚本时别忘了输出重定向>
    php 中函数获取可变参数的方法, 这个语法有点像 golang 语言中的
    单词number 和 numeral 的区别
    vim 调到闭合的{
    [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
    js中有包装类,java中也有包装类
    cin中函数的作用
    string类小结
    结构、位域、联合、枚举之小小总结
    运算符重载(C++)
  • 原文地址:https://www.cnblogs.com/-beyond/p/6113166.html
Copyright © 2020-2023  润新知