队列的基本操做-队列的链式存储结构(带图详细)

什么是队列?        

        队列是一种特殊的线性表,特殊之处在于它只容许在表的前端(front)进行删除操做,而在表的后端(rear)进行插入操做,和栈同样,队列是一种操做受限制的线性表。进行插入操做的端称为队尾,进行删除操做的端称为队头。队列中没有元素时,称为空队列。前端

        链式队列是用单链表的形式来表示队列,可是要符合队列“尾进头出”的规则后端

链式队列的构建:

链式队列=单链表+队列函数

以下代码是对一个队列的链式存储的定义:首先定义一个构成单链表基本单元的结点,而后定义由指向结点的头指针、指向结点的尾指针和表示队列长度的变量组成的队列spa

//链式队列    链式结构+队列
//链式结构体 =单链表的基本单元:结点 
struct Node{
    int data;//数据域 
    struct Node* next;     //指针域 
}; 
//队列结构体=头指针+尾指针+队列大小 
 struct Queue{
    struct Node* front;//指向结点的头指针 
    struct Node* rear;//指向结点的尾指针 
    int queueSize; //队列大小/长度 
}; 

建立结点:

队列是由一个一个结点经过指针连接起来的指针

//建立结点
struct Node* createNode(int data){
    struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));
    newNode->next=NULL;
    newNode->data=data;
    return newNode;    
}; 

队列的初始化:

首先使用malloc函数为队列分配一块内存,初始状态队列的头指针和尾指针在一块儿都为空(不带头结点),而后设置队列的大小为0。这样队列的初始化操做就完成了。code

//队列初始化
struct Queue* createQueue(){
    struct Queue* queue=(struct Queue*)malloc(sizeof(struct Queue));//分配内存空间 
    queue->front=queue->rear=NULL;//头指针和尾指针在一块儿为空 
    queue->queueSize=0;//队列大小为0 
    return queue;
} 

入队操做:

准备工做:首先建立入队函数push()传入两个参数,一个是须要插入那个队列另外一个是须要插入的数据。而后调用createNode()函数建立一个新的结点,保存插入的数据。blog

准备工做完成后:先判断队列是不是空队列,若是为空队列直接将front和rear指针指向这个新建结点便可,若不为空,则将尾指针的下一个位置指向新建结点,而后再将尾指针修改成这个新建结点。(这个地方我我的感受比较难懂,个人理解是 先告诉这个新建结点在哪里,而后在移动rear指针到新建结点把他设为队尾)。队列

最后别忘记queueSize自增,表示队列长度的增长。内存

 

void push(struct Queue* queue,int data){
    struct Node* newNode=createNode(data);
    if(queue->queueSize==0)
        queue->front=newNode;
        else
        queue->rear->next=newNode;
        queue->rear=newNode;
        queue->queueSize++;
    
} 

 获取对头元素:

首先判断队列queueSize是否为0若是为0说明队列为空,若是不为空直接返回队列头指针的data值。it

//获取对头元素
int queryFront(struct Queue* queue) {
    if(queue->queueSize==0){
        printf("队列为空没法获取对头元素");
        printf("\n"); 
        return -1; 
    }
    return queue->front->data;
}

判断队列是否为空:

 代码很简单就不一一解释了。

//判断队列是否为空
int empty(struct Queue* queue){
    if(queue->queueSize==0)
    return 0;
    else
    return 1;
} 

出队操做:

新建头结点指针指向队列front指针所指结点的下一个位置(由于出队操做是在对头进行的),而后释放原来的队头结点,最后设置这个新的头结点为队头。最后队列的大小减1.

 

 

//出队操做
void pop (struct Queue* queue){
    if(queue->queueSize==0){

    printf("队列为空不能出队");
    exit(0);
     }else{
         struct Node* newFrontNode=queue->front->next;
         free(queue->front); 
         queue->front=newFrontNode;
         queue->queueSize--;
     }
}

 最后附上完整代码:

#include <stdio.h>
#include <stdlib.h>
//链式队列    链式结构+队列
//链式结构体 =单链表的基本单元:结点 
struct Node{
    int data;//数据域 
    struct Node* next;     //指针域 
}; 
//队列结构体=头指针+尾指针+队列大小 
 struct Queue{
    struct Node* front;//指向结点的头指针 
    struct Node* rear;//指向结点的尾指针 
    int queueSize; //队列大小/长度 
}; 
//建立结点
struct Node* createNode(int data){
    struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));
    newNode->next=NULL;
    newNode->data=data;
    return newNode;    
}; 
//队列初始化
struct Queue* createQueue(){
    struct Queue* queue=(struct Queue*)malloc(sizeof(struct Queue));//分配内存空间 
    queue->front=queue->rear=NULL;//头指针和尾指针在一块儿为空 
    queue->queueSize=0;//队列大小为0 
    return queue;
} 
//入队
void push(struct Queue* queue,int data){
    struct Node* newNode=createNode(data);
    if(queue->queueSize==0)
        queue->front=newNode;
        else
        queue->rear->next=newNode;
        queue->rear=newNode;
        queue->queueSize++;
    
} 
//获取对头元素
int queryFront(struct Queue* queue) {
    if(queue->queueSize==0){
        printf("队列为空没法获取对头元素");
        printf("\n"); 
        return -1; 
    }
    return queue->front->data;
}
//判断队列是否为空
int empty(struct Queue* queue){
    if(queue->queueSize==0)
    return 0;
    else
    return 1;
} 
//出队操做
void pop (struct Queue* queue){
    if(queue->queueSize==0){

    printf("队列为空不能出队");
    exit(0);
     }else{
         struct Node* newFrontNode=queue->front->next;
         free(queue->front); 
         queue->front=newFrontNode;
         queue->queueSize--;
     }
}
int main(){
    struct Queue* myQueue=createQueue();
    push(myQueue,1);
    push(myQueue,2);
    push(myQueue,3);
    while(empty(myQueue)){
        printf("%d\t",queryFront(myQueue));
        pop(myQueue);
    }
    printf("\n");
    system("pause");
return 0;
}
 
相关文章
相关标签/搜索