C语言数据结构之队列篇
2017-08-06 19:42
417 查看
定义
队列是只允许在一端删除,在另一端插入的线性表
允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)。
特性
先进先出(FIFO, First In First Out)
ADT Queue {
//对象:由数据类型为QueueData的元素构成
int EnQueue (Queue *Q, QueueData x); //进队
int DeQueue (Queue *Q, QueueData &x);//出队
int GetFront (Queue *Q, QueueData &x);//取队头
void InitQueue (Queue *Q); //置空队
int QueueEmpty (Queue *Q); //判队空否
int QueueFull (Queue *Q); //判队满否
}
队列的进队和出队原则
进队时队尾指针先进一 rear = rear + 1,再将新元素按 rear 指示位置加入。
出队时队头指针先进一 front = front + 1,再将下标为 front 的元素取出。
队满时再进队将溢出出错;
队空时再出队将队空处理。
解决办法之一:将队列元素存放数组首尾相接,形成循环(环形)队列。
循环队列
队列存放数组被当作首尾相接的表处理。
队头、队尾指针加1时从QueueSize -1直接进到0,可用语言的取模(余数)运算实现。
队头指针进1: front = (front+1) % QueueSize;
队尾指针进1: rear = (rear+1) % QueueSize;
队列初始化:front = rear = 0;
队空条件:front == rear;
队满条件:(rear+1) % QueueSize == front
队列的链接表示——链式队列
队头在链头,队尾在链尾。
链式队列在进队时无队满问题,但有队空问题。
队空条件为 front == NULL
下面是关于链式队列的一些基本操作
#include "LinkQueue.h"
#include <stdlib.h>
Queue* Create_Queue()
{
Queue * q = (Queue*)malloc(sizeof(Queue)/sizeof(char));
if (q == NULL)
{
errno = MALLOC_ERROR;
return NULL;
}
// 置空队
q->front = NULL;
q->rear = NULL;
return q;
}
int QueueEmpty (Queue *q)
{
if (q == NULL)
{
return FALSE;
}
return q->front == NULL;
}
int EnQueue (Queue *q, QueueData x)
{
if (q == NULL)
{
errno = ERROR;
return FALSE;
}
Node * node = (Node*)malloc(sizeof(Node)/sizeof(char));
if (node == NULL)
{
errno = MALLOC_ERROR;
return FALSE;
}
node->data = x;
node->next = NULL;
if (q->front == NULL)
{
q->front = node;
q->rear = node;
}
else
{
q->rear->next = node;
q->rear = node;
}
return TRUE;
}
int DeQueue (Queue *q, QueueData *x)
{
if (q == NULL)
{
errno = ERROR;
return FALSE;
}
if (QueueEmpty(q))
{
errno = EMPTY_QUEUE;
return FALSE;
}
Node *p = q->front;
*x = p->data;
q->front = p->next;
free(p);
if (q->front == NULL)
q->rear = NULL;
return TRUE;
}
int GetFront (Queue *q, QueueData *x)
{
if (q == NULL)
{
errno = ERROR;
return FALSE;
}
if (QueueEmpty(q))
{
errno = EMPTY_QUEUE;
return FALSE;
}
*x = q->front->data;
return TRUE;
}
int Destroy_Queue (Queue *q)
{
if (q == NULL)
{
errno = ERROR;
return FALSE;
}
int x;
while (QueueEmpty(q) != TRUE)
{
DeQueue(q, &x);
}
free(q);
return TRUE;
}
队列是只允许在一端删除,在另一端插入的线性表
允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)。
特性
先进先出(FIFO, First In First Out)
ADT Queue {
//对象:由数据类型为QueueData的元素构成
int EnQueue (Queue *Q, QueueData x); //进队
int DeQueue (Queue *Q, QueueData &x);//出队
int GetFront (Queue *Q, QueueData &x);//取队头
void InitQueue (Queue *Q); //置空队
int QueueEmpty (Queue *Q); //判队空否
int QueueFull (Queue *Q); //判队满否
}
队列的进队和出队原则
进队时队尾指针先进一 rear = rear + 1,再将新元素按 rear 指示位置加入。
出队时队头指针先进一 front = front + 1,再将下标为 front 的元素取出。
队满时再进队将溢出出错;
队空时再出队将队空处理。
解决办法之一:将队列元素存放数组首尾相接,形成循环(环形)队列。
循环队列
队列存放数组被当作首尾相接的表处理。
队头、队尾指针加1时从QueueSize -1直接进到0,可用语言的取模(余数)运算实现。
队头指针进1: front = (front+1) % QueueSize;
队尾指针进1: rear = (rear+1) % QueueSize;
队列初始化:front = rear = 0;
队空条件:front == rear;
队满条件:(rear+1) % QueueSize == front
队列的链接表示——链式队列
队头在链头,队尾在链尾。
链式队列在进队时无队满问题,但有队空问题。
队空条件为 front == NULL
下面是关于链式队列的一些基本操作
#include "LinkQueue.h"
#include <stdlib.h>
Queue* Create_Queue()
{
Queue * q = (Queue*)malloc(sizeof(Queue)/sizeof(char));
if (q == NULL)
{
errno = MALLOC_ERROR;
return NULL;
}
// 置空队
q->front = NULL;
q->rear = NULL;
return q;
}
int QueueEmpty (Queue *q)
{
if (q == NULL)
{
return FALSE;
}
return q->front == NULL;
}
int EnQueue (Queue *q, QueueData x)
{
if (q == NULL)
{
errno = ERROR;
return FALSE;
}
Node * node = (Node*)malloc(sizeof(Node)/sizeof(char));
if (node == NULL)
{
errno = MALLOC_ERROR;
return FALSE;
}
node->data = x;
node->next = NULL;
if (q->front == NULL)
{
q->front = node;
q->rear = node;
}
else
{
q->rear->next = node;
q->rear = node;
}
return TRUE;
}
int DeQueue (Queue *q, QueueData *x)
{
if (q == NULL)
{
errno = ERROR;
return FALSE;
}
if (QueueEmpty(q))
{
errno = EMPTY_QUEUE;
return FALSE;
}
Node *p = q->front;
*x = p->data;
q->front = p->next;
free(p);
if (q->front == NULL)
q->rear = NULL;
return TRUE;
}
int GetFront (Queue *q, QueueData *x)
{
if (q == NULL)
{
errno = ERROR;
return FALSE;
}
if (QueueEmpty(q))
{
errno = EMPTY_QUEUE;
return FALSE;
}
*x = q->front->data;
return TRUE;
}
int Destroy_Queue (Queue *q)
{
if (q == NULL)
{
errno = ERROR;
return FALSE;
}
int x;
while (QueueEmpty(q) != TRUE)
{
DeQueue(q, &x);
}
free(q);
return TRUE;
}
相关文章推荐
- C语言数据结构练习——停车场管理系统(使用栈和队列)(草稿的草稿)
- (C语言)队列的链式实现(数据结构十一)
- 数据结构C语言实现之链式队列的6种算法代码
- C语言数据结构之队列
- 数据结构---队列C语言实现
- C语言数据结构-顺序队列
- c语言数据结构——循环队列
- 数据结构:循环队列(C语言实现)
- 数据结构 c语言实现顺序队列(输数字入队,字符出队)
- 数据结构 c语言设计队列 实现桶式排序和基数排序 测试性能
- (C语言)队列的链式实现(数据结构十一)
- 数据结构循环队列斐波拉契数列的实现(c语言)
- 数据结构:循环队列(C语言实现)
- 数据结构---队列C语言实现
- 数据结构 优先队列 C语言实现
- 数据结构-顺序队列(C语言)
- (C语言)数据结构 --- 队列、栈
- C语言数据结构中队列的相关操作
- [数据结构]C语言队列的实现(通俗易懂,跟风到底)
- C语言数据结构队列