数据结构——队列
宗旨:技术的学习是有限的,分享的精神是无限的。
1、特性:先进先出(FIFO)
2、应用:
图形的广度优先搜索法
优先队列
操作系统的工作调度
3、用数组仿真队列
(1)队列数组结构
int queue[MAX_SIZE]; //队列最大容量
int front = -1; //队列头,随数据的输出变动
int rear = -1; //队列尾,随数据的输入变动
(2)数据的存取【数据输入是从后端rear进行,数据取出是从前端front进行】
数据存入队列:将队尾指针往rear后移一位:若队尾rear小于等于队列的最大索引值MAX_SIZE-1,则将数据存入rear所指的数组元素中,否则无法存入数据。
void add_queue(int value)
{
if(rear >= MAX_SIZE)
{
printf("thequeue is full!\n");
}
else
{
rear++;
queue[rear] = value;
}
}
数据取出队列:检查队列中是否有数据存在;若头指针front等于尾指针rear,则表示队列中无数据;若头指针不等于尾指针,则将头指针往后移;取出头指针所指的数组元素内容。
int del_queue(void)
{
int temp;
if(front == rear)
{
return -1;
}
else
{
front++;
temp = queue[front];
queue[front] = 0;
return temp;
}
}
4、用链表仿真队列
(1)队列链表结构
typedef struct node
{
int data;
struct node *next;
} list, *link;
link front = NULL; //向链表顶端的指针
link rear = NULL; //向链表尾端的指针
(2)数据的存取
数据输入队列【push】:建立一个新节点;判断队尾指针rear是否为NULL,若为NULL,则此新节点为队列的第一个数据,front和rear都指向它,若不为NULL,将rear所指节点的指针指向新节点,将rear指向新节点。
void add_queue(int value)
{
link new;
new = (link)malloc(sizeof(list));
new-> data = value;
new-> next = NULL;
if(rear == NULL)
{
front = new;
}
else
{
rear-> next = new -> next;
}
rear = new;
}
数据输出堆栈【pop】:先保留队头指针front所指的位置;将头指针front指向下一个节点;取出之前保留指针所指的节点内容;释放之前保留头指针所指向的节点内容。
int pop(void)
{
link top;
int temp;
if(front != NULL)
{
top = front;
front = front -> next;
temp = top -> data;
free(top);
return temp;
}
return -1;
}
5、环形链表
当插入数据时,尾指针rear会向后移动;而输出数据时,头指针front会向后移动。
当尾指针rear等于MAX_SIZE-1时,需回到队列最前端:(rear+ 1)% MAX_SIZE
尾指针等于头指针:
队列为空:front= rear;
队列为满:(rear+ 1)% MAX_SIZE
void add_queue(int value)
{
rear = (rear + 1) % MAX_SIZE;
if(front == rear)
{
printf("queueis full!\n");
}
else
{
queue[rear] = value;
}
}
int del_queue(void)
{
int temp;
if(front == rear)
{
return - 1;
}
temp = queue[front + 1];
//queue[front+ 1] = 0;
front = (front + 1) % MAX_SIZE;
return temp;
}