队列,先进先出,本质上是将存取点限制在头尾的线性表(尾进头出),构如其名,就像平常排队先排队的先享受服务。顺序队列(顺序表实现的队列),特别是循环队列,主要难点在于出入队后,队头队尾指针如何变化,设maxSize为队列中最大元素个数。
- 无论何种形式,队空标志一定是队头指针== 队尾指针。入队队尾巴指针:q.rear = (q.rear + 1) % maxSize出队队头指针:q.front = (q.front + 1 )% maxSize;判断队长:q.length = (q.rear +maxSize - q.front)%maxSize;
以下为链队列的实现,定义了一个结点的结构体和一个队列的结构体;其中结点包括 值 和 指向下一个结点的指针,队列包括头、尾指针。 这样的定义(即定义结点的结构体,也定义链表的结构体)也可以运用到单链表中,通过这种可以把链表当做一个整体进行操作,而不是一堆连起来的结点。
#include#include #define true 1 #define false 0 typedef struct _node { int value; struct _node* next; } Node; typedef struct _queue { Node *front; Node *rear; } Queue; void Print(Queue* queue);//打印队列 Queue* InitQueue(Queue* queue);//初始化队列; int IsEmpty(Queue* queue);//链表判空 void EnQueue(Queue* queue, int x);//入队 int DeQueue(Queue* queue, int* x);//出队 int main() { int x; Queue* queue = (Queue*)malloc(sizeof(Queue));//指向队列的指针; InitQueue(queue); if(IsEmpty(queue)) printf("The queue is empty.n"); EnQueue(queue,3); Print(queue); if( DeQueue(queue,&x) ) printf("%dn",x); Print(queue); } Queue* InitQueue(Queue* queue) { queue->front = queue->rear = (Node*)malloc(sizeof(Node));//初始化这个队列的头尾结点。 queue->front->next = NULL;//队列置空 return queue; } int IsEmpty(Queue* queue) { if(queue->front == queue->rear) return true; else return false; } void EnQueue(Queue* queue, int x) { Node *p = (Node*)malloc(sizeof(Node));//定义一个新结点 p->value = x; p->next = NULL; queue->rear->next = p;//新结点放到尾指针的下一个位置 queue->rear = p;//尾指针指向新结点 } int DeQueue(Queue* queue, int* x) { if(IsEmpty(queue))//空队列出队失败 return false; Node* p = queue->front->next; *x = p->value; queue->front->next = p->next;//队列头指针指向下一个结点 if(queue->rear = p)//队列只有一个元素时,元素出队,队列置空。 queue->rear = queue->front; return true; } void Print(Queue* queue) { Node* p = queue->front->next; if(!IsEmpty(queue)) { while(p != NULL) { printf("%d ",p->value); p = p->next; } } else { printf("Fail to print"); } printf("n"); }



