当前位置 博文首页 > ice_elephant的博客:链式队列实现

    ice_elephant的博客:链式队列实现

    作者:[db:作者] 时间:2021-09-16 15:49

    图解

    队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列。为了 操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点

    如图:
    在这里插入图片描述
    结构
    typedef struct _Node{
    int date;
    _Node *next;

    } Node;
    //这个队列"链表"带了长度,
    typedef struct _Queue{
    int length;
    Node front;
    Node rear;
    }
    /

    链式队列,特点使用指针
    1、队列初始化
    2、判断队列元素是否已满
    3、判断队列是否为空
    4、入队
    5、出队
    6、获取头元素
    7、出列所有元素
    8、队列遍历
    */

    /*
    链式队列,特点使用指针
    1、队列初始化
    2、判断队列元素是否已满
    3、判断队列是否为空
    4、入队
    5、出队
    6、获取头元素
    7、出列所有元素
    8、队列遍历
    */
    
    #include<iostream>
    #include<Windows.h>
    
    using namespace std;
    
    #define MAX_SIZE 5
    
    typedef int dateType;
    
    typedef struct _QNode{
    	dateType date;
    	struct _QNode *next;
    
    }QNode;
    
    
    
    typedef struct _Queue{
    	int length;
    	 QNode *front;
    	 QNode *rear;
    
    }Queue;
    //1、队列初始化
    bool initQueue(Queue *&LQ){
    	
    	if(!LQ)  return false;
    
    	LQ->front = NULL;
    	LQ->rear = NULL;
    	return true;
    }
    
    
    //2、判断队列是否为空
    bool isEmpty(Queue *&LQ){
    
    
    	if(LQ->front==NULL){
    		return true;
    	}
    	return false;
    
    }
    
    //3、判断队列是否已满了
    bool isFully(Queue *&LQ){
    	
    	if(LQ->length==MAX_SIZE){
    	
    		return true;
    	}
    
    	return false;
    
    }
    
    //4、判断添加元素
    bool addQueue(Queue *&LQ,dateType date){
    
    	if(!LQ) return false;
    	
    	if(isFully(LQ)){ cout<<"队列已满,无法添加!"<<endl;
    	
    		return false;
    	}
    
    	
    	//在尾部添加元素,有两种情况,第一队列为空的情况下需要吧头节点也指向第一个元素
    	//否则直接尾部当前结点的next指向元素,并将rear指向当前结点
    	
    	_QNode * tmp = new _QNode;
    
    	tmp->date = date;
    	tmp->next = NULL;
    
    
    
    	if(isEmpty(LQ)){
    		LQ->front=LQ->rear=tmp;
    	
    	
    	}else{
     		LQ->rear->next = tmp;
    		LQ->rear = tmp;
    
    	}
    	LQ->length++;
    	cout<<"成功添加元素:"<<date<<"\t";
    
    	return true;
    
    }
    
    
    //5、出队
    bool deleteType(Queue *&LQ,dateType *date){
    	
    	//出头节点,不为空的情况下如果只有一个元素,出来之后要把rear也置NULL
    
    	if(isEmpty(LQ)){
    		cout<<"队列为空"<<endl;
    		return false;
    	}
    
    	if(!LQ) return false;
    
    	QNode *tmp;
    	
    	tmp = LQ->front;
    	*date = tmp->date;
    	LQ->front = tmp->next;
    
    	if(LQ->front==NULL) LQ->rear = NULL;
    
    	LQ->length--;
    
    	delete tmp;
    
    	return true;
    
    
    
    }
    
    
    //6、销毁
    
    
    void deleteQueue(Queue *&LQ){
    	
    	if(!LQ||isEmpty(LQ)){
    		return ;
    	}
    
    	QNode *tmp ;
    
    	while(LQ->front){
    		tmp = LQ->front;
    
    		cout<<"出队元素"<<tmp->date<<"\t";
    		LQ->front = LQ->front->next;
    		delete tmp;
    
    		
    	}
    	
    	cout<<"\t";
    	
    
    
    }
    //7、遍历元素
    void getHeadQueue(Queue *&LQ,dateType *date){
    
    	if(!LQ) return ;
    	if(isEmpty(LQ)) {
    		cout<<"队列为空"<<endl;
    		return;
    	}
    	if(!date) return ;
    
    
    	*date = LQ->front->date;	
    
    }
    
    //遍历
    void printQueue(Queue *&LQ){
    	
    	if(!LQ) return;
    
    	if(isEmpty(LQ)) return ;
    	
    	QNode *tmp = LQ->front;
    	
    
    	while(tmp){
    		cout<<tmp->date<<"\t";
    
    		tmp = tmp->next;
    
    	}
    
    
    }
    
    int  main(void){
    
    
    	//测试这个叫 循环队列
    	Queue *Q = new Queue;
    
    	if(initQueue(Q)){
    		cout<<"队列初始化成功!"<<endl;
    	}else{
    		cout<<"队列初始化失败"<<endl;
    	}
    
    	int date;
    
    	//插入元素
    	cout<<"请输入元素:";
    	for(int i=0;i<5;i++){
    		cin>>date;
    		addQueue(Q,date);
    
    		
    
    	}
    	cout<<"获取头结点元素:"<<endl;
    	cout<<"删除元素:"<<endl;
    	
    
    		
    
    		
    	for(int i=0;i<5;i++){
    
    	deleteType(Q,&date);
    	cout<<"deleteType:"<<date<<"\t";
    	getHeadQueue(Q,&date);
    	cout<<"getHeadQueue:"<<date<<"\t";
    	
    	
    		}
    	
    	cout<<"遍历元素:";
    	printQueue(Q);
    
    	system("pause");
    
    	return 0;
    
    }
    
    cs