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

来源:互联网 发布:java 当前时间转整型 编辑:程序博客网 时间:2024/06/06 03:48

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

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

#define TRUE 1#define FALSE 0typedef 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 0typedef 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
原创粉丝点击