第三章:4.栈和队列 -- 单链队列的表示及实现

前言:

  我们生活中排队模型的特点是,最早进入队伍的元素最早离开。本节提出队列来描述类似排队的结构模型。

 

目录:

  1、栈

  2、栈的应用举例

  3、栈与递归的实现

  4、队列

  5、离散事件模型

 

正文:

  队列的定义:

    和栈相反,队列(queue)是一种先进先出(first in first out, FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端就做队尾(rear),允许删除的一端称为队头(front)。

 

  双端队列:

    双端队列是限定插入和删除操作在表的两端进行的线性表。(一种限制性的数据结构)

 

  队列的链式表示和实现:

    用链表表示的队列简称为 链队列 。一个链队列显然需要两个分别指向队头 和 队尾 的指针(分别称为头指针 和 尾指针)。这里和单链表一样,为了方便也给队列添加一个头结点。

  

  队列示意图:

        

  单链队列的存储结构:

    //结点定义
    typedef struct QNode{
        ElemType data;                //单链表中结点的数据域
        struct QNode *next;            //结点的指针域
    }QNode;

    //队列链定义
    typedef struct{
        QNode *front;                //队头指针
        QNode *rare;                //队尾指针
    }LinkQueue;

 

  代码实现:

   

#include<stdio.h>
#include<stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态码
typedef int Status;

typedef int ElemType;

//结点定义
typedef struct QNode{
    ElemType data;                //单链表中结点的数据域
    struct QNode *next;            //结点的指针域
}QNode;

//队列链定义
typedef struct{
    QNode *front;                //队头指针
    QNode *rare;                //队尾指针
}LinkQueue;

//初始化一个空队列
Status InitQueue(LinkQueue &Q){
    Q.front=Q.rare=(QNode *)malloc(sizeof(QNode));
    if(!Q.front) exit(OVERFLOW);
    Q.front->next=NULL;
    return OK;
}

//判断是否为空队列
Status QueueEmpty(LinkQueue &Q){
    if(Q.front==Q.rare)
        return TRUE;
    return FALSE;
}

//判断长度
Status QueueLength(LinkQueue &Q){
    if(Q.front==Q.rare)
        return 0;
    int i=0;
    QNode *q=Q.front;
    while(q->next){
        q=q->next;
        i++;
    }
    return i;
}


//向队列尾部插入元素e
Status EnQueue(LinkQueue &Q,ElemType e){
    //生成 结点
    QNode *q;                        //指向新生成的结点
    q=(QNode *)malloc(sizeof(QNode));
    if(!q) exit(OVERFLOW);
    q->data=e;
    q->next=NULL;

    Q.rare->next=q;
    Q.rare=q;
    return OK;
}

//删除队列头部元素并返回
Status DeQueue(LinkQueue &Q,ElemType &e){
    if(Q.front==Q.rare) return ERROR;
    QNode *q=Q.front->next;
    e=Q.front->next->data;
    Q.front->next=Q.front->next->next;
    if(!Q.front->next)
        Q.rare=Q.front;
    free(q);
    return OK;
}

void printV(LinkQueue &Q){
    if(Q.front==Q.rare) 
        printf("%s\n","空队列");
    QNode *q=Q.front;
    while(q->next){
        printf("地址:%p",q->next);
        printf("值:%d\n",q->next->data);
        q=q->next;
    }
}

void main(){
    LinkQueue Q;
    InitQueue(Q);
    EnQueue(Q,1);
    EnQueue(Q,2);
    EnQueue(Q,3);
    EnQueue(Q,4);

    printV(Q);
    ElemType e;

    //删除队列
    DeQueue(Q,e);
    printf("\n%s\n","从队头删除一个元素后");
    printV(Q);

    printf("\nlength:%d\n",QueueLength(Q));
}

  

  运行结果:

  

  

posted @ 2016-12-20 17:31  AHAU航哥  阅读(519)  评论(0编辑  收藏  举报