数据结构学习(四)、队列

队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。线性表分为顺序存储和链式存储,栈是线性表,

所以也有这两种存储方式。同样,队列作为一种特殊的线性表,也同样存在这两种存储方式。我们先来看队列的顺序存储结构。

* 循环队列的顺序存储结构 */
typedef struct
{
    ElemType data[MAXSIZE];
    int front; /*头指针*/
    int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
}SqQueue;

顺序队列初始化

顺序队列初始化,就是把队头和队尾都归0,也就是 Q->front=0; Q->rear=0;

/*
  初始化一个空队列Q 
  @params Q 队列指针
*/
int InitQueue(SqQueue *Q)
{
    Q->front = 0;
    Q->rear  = 0;
    return OK;
}

顺序队列入队

顺序队列入队操作,最开始需要判断队列是否满了,未满则先给队尾元素赋值,然后再将队尾指针向后移动一位,若到最后则转到数组头部

 

/*
    未满队列插入操作
    @params Q 队列指针
    @params e 插入元素
*/
Status EnQueue(SqQueue *Q,ElemType e)
{
    if((Q->rear+1)%MAXSIZE == Q->front)
        return ERROR;
    Q->data[Q->rear] = e;
    Q->rear = (Q->rear+1)%MAXSIZE;
    return OK;
}

 

顺序队列出队

顺序队列出队操作,最开始需要判断队列是否为空了,不为空则先给队头元素赋值给e,然后再将队头向后移一位,若到最后则转到数组头部

 

/*
     未空队列出栈操作
     @params Q 队列指针
     @params e 接收出队数据指针
*/
Status DeQueue(SqQueue *Q,ElemType *e)
{
    if(Q->rear == Q->front)
        return ERROR;
    *e = Q->data[Q->front];
    Q->front = (Q->front+1)%MAXSIZE;
    return OK;
}    

 顺序队列就讲到这里,接下来我们先来看队列的链式存储结构,队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。。

/* 结点结构 */
typedef struct Node
{
    ElemType data;
    struct Node * next;
}Node,*QueueNode;
/* 队列的链表结构 */
typedef struct
{
    QueueNode front;
    QueueNode rear;
    int length;
}QueueList;

链式队列初始化

链式队列初始化,先产生一个头结点,然后让头结点指向NULL,再分别让队列的头尾指向头结点;

 

/*
    初始化链式队列
    @params Q 队列指针
*/
Status InitQueue(QueueList *Q){
    QueueNode head;
    head = (QueueNode)malloc(sizeof(Node));
    if(!head)
        return ERROR;
    head->next = NULL;
    Q->front = head;
    Q->rear  = head;
    return OK;
}

 

链式队列入队操作

链式队列入队操作,先产生一个结点,让该结点指向NULL,再让队列的尾结点指向该结点,最后将该结点赋值给尾结点,队列计数加一

 

/*
    入队操作
     @params Q 队列指针
     @params e 入队元素
*/
Status EnQueue(QueueList *Q,ElemType e)
{
   QueueNode n,t;
   n = (QueueNode)malloc(sizeof(Node));
   if(!n)
     return ERROR;
   n->data = e;
   n->next = NULL;
   Q->rear->next = n;
   Q->rear = n;
   Q->length ++;
   return OK;
}

 

链式队列出队操作

链式队列出队操作,先判断是否为空队列,不为空队列,将第一结点值赋给e,头结点指向第一结点的下一结点,释放头结点,队列计数减一

 

/*
   出队操作
    @params Q 队列指针
    @params e 接收对象指针
*/
Status DeQueue(QueueList *Q,ElemType *e)
{
    QueueNode n;
    if(Q->rear == Q->front)
        return ERROR;
    n = Q->front->next;
    *e = n->data;
    Q->front->next = n->next;
    free(n);
    Q->length --;
    return OK;
}

 

posted on 2016-09-23 14:51  会学习的猪  阅读(307)  评论(0编辑  收藏  举报

导航