数据结构——c语言描述 第三章(3) 队列

队列其实也是一种限定性线性表,它其实和栈在某种程度上是很有相似性的,但是它和栈的最重要的一个区别就是栈的性质是先进后出,但是队列的基本性质是先进先出,这和人们生活中的排队的队列是很相似的。

下面写出链栈的基本实现,其实这种简单的数据结构概念上还是比较容易理解的。

#define TRUE 1
#define FALSE 0

typedef char Ele_type;

typedef struct Node {
    Ele_type data;
    struct Node *next;
}LinkQueueNode;

typedef struct Queue {
    LinkQueueNode *rear;
    LinkQueueNode *front;
}LinkQueue;

int InitQueue (LinkQueue *Q) {
    if (Q == NULL)
        return FALSE;

    Q->front = (LinkQueueNode *) malloc (sizeof (LinkQueueNode));
    if (Q->front != NULL) {
        Q->rear = Q->front;
        Q->rear->next = NULL;
        return TRUE;
    }else
        return FALSE;
}

int EnterQueue (LinkQueue *Q , Ele_type c) {
    LinkQueueNode *temp = (LinkQueueNode *) malloc (sizeof (LinkQueueNode));

    if (Q == NULL)
        return FALSE;

    if (temp != NULL) {
        temp->data = c;

        Q->rear->next = temp;
        temp->next = NULL;
        Q->rear = temp;
        return TRUE;
    }else 
        return FALSE;
}

int DelQueue (LinkQueue *Q , Ele_type *c) {
    if (Q == NULL || c == NULL)
        return FALSE;

    LinkQueueNode *temp = Q->front->next;
    *c = temp->data;
    if (temp == Q->rear) {
        Q->rear = Q->front;
        Q->front = NULL;
    }else 
        Q->front->next = temp->next;
    free (temp);
    return TRUE;
}
这个实现包括进队,出队和初始化队列。虽然非常简单,但是这里还有有几点需要注意的。第一点是这里对基本的队列节点进行了二次抽象化,抽象出来一个LinkQueue的数据结构,这个数据结构对应的是队列的头节点和尾节点,这里抓住了最重要的部分就是,抽象化出进队列和出队列的操作。第二个需要注意的地方就是,在这里使用了两个指针指向了一个链表的头节点和尾节点,这里在实现出队列的操作时,当本来队列中只有一个元素的时候,要主要对尾节点的处理,不然会出现问题。当然这里还可以对其他链表的形式有启示,在以后的编程的过程需要注意的!

————————————————————————————————————————分割线 2016.6.27凌晨

第二个部分就是循环队列,书上给出了牺牲一个数组元素的算法实现了循环数组,我在这里就不赘述,作者说可以有不用牺牲数组元素就可以完成的算法,使用一个标志tag实现,但在这里我个人的愚见,这里不如使用一个计数器count,每次进队列的时候加一,每次出队列的时候减一,当值为0的时候,就可以认为是空队列,当值等于MAXSIZE的时候就可以认为是空队列,不仅让算法简化,而且空间利用率也提升,当然这只是我的个人的见解。下面上代码。

#define MAXSIZE 10
#define TRUE 1
#define FALSE 0

typedef int EleType;

typedef struct node {
    EleType data_arr[MAXSIZE];
    int front;
    int rear;
    int count;
}SeqQueue;

void InitSeqQueue (SeqQueue *Q) {
    Q->front = Q->rear = 0;
    Q->count = 0;
}

int EnterQueue (SeqQueue *Q , EleType c) {
    if (Q->count == MAXSIZE)
        return FALSE; // the queue is full

   Q->data_arr[Q->rear] = c;
   Q->rear = (Q->rear+1)%MAXSIZE;
   Q->count++;
   return TRUE;
}

int DelQueue (SeqQueue *Q , EleType *c) {
    if (Q->count == 0)
        return FALSE;

    *c = Q->data_arr[Q->front];
    Q->front = (Q->front+1) % MAXSIZE;
    Q->count--;
    return TRUE;
}

——————————————————————————————————————分割线2016.6.28凌晨


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值