队列其实也是一种限定性线性表,它其实和栈在某种程度上是很有相似性的,但是它和栈的最重要的一个区别就是栈的性质是先进后出,但是队列的基本性质是先进先出,这和人们生活中的排队的队列是很相似的。
下面写出链栈的基本实现,其实这种简单的数据结构概念上还是比较容易理解的。
#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凌晨