数据结构——c语言描述 第三章(3) 队列
2016-06-27 00:06
369 查看
队列其实也是一种限定性线性表,它其实和栈在某种程度上是很有相似性的,但是它和栈的最重要的一个区别就是栈的性质是先进后出,但是队列的基本性质是先进先出,这和人们生活中的排队的队列是很相似的。
下面写出链栈的基本实现,其实这种简单的数据结构概念上还是比较容易理解的。
————————————————————————————————————————分割线 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凌晨
下面写出链栈的基本实现,其实这种简单的数据结构概念上还是比较容易理解的。
#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凌晨
相关文章推荐