您的位置:首页 > 编程语言 > C语言/C++

队列与循环队列

2017-05-02 17:53 225 查看

队列的特点:

先进先出(FIFO)(first in first out)。

有两个指针,分别为头指针和尾指针。出队列时,头指针所指数据取出,头指针加一;入队时,数据进入尾指针所指位置,然后尾指针加一。(可以先加再存/取,也可以先存/取后加。不过要前后一致)。

我们先用结构体来模拟简单队列。

下列为队列的出入队列代码及结果:

#include <stdio.h>
#include <stdlib.h>
//队列中的数据
struct node{
int data;
struct node* next;
};
//头指针
struct node* front = NULL;
//尾指针
struct node* rear = NULL;
//入队列
void in_queue(int data)
{
struct node* tmp = malloc(sizeof(struct node));
tmp->data = data;
tmp->next = NULL;

if(rear == NULL && front == NULL)
front = rear = tmp;
else {
rear->next = tmp;
rear = rear->next;
}
}
//出队列
int out_queue()
{
int tmp ;
struct node* t;
if(front == NULL){
printf("\nqueue empty. \n");
rear = NULL;
return -1;
}
else {
tmp = front->data;
t = front;
front = front->next;
free(t);
}
return tmp;
}
//删除队列
void set_null_queue()
{
struct node* t;
while(front != NULL){
t = front;
front = front->next;
free(t);
}
}
int main()
{
int i;
for(i=0; i<5; i++)
in_queue(10+i);

for(i=0; i<6; i++)
printf("%d\t",out_queue());
printf("\n");

for(i=0; i<5; i++)
in_queue(21+i);
for(i=0; i<5; i++)
printf("%d\t",out_queue());
printf("\n");

set_null_queue();

return 0;
}

结果为:



循环队列:

只要队列不满或不空,是需要一直存取数据的。所以我们要把队列变成一个环形。让头尾指针在环里不停地走。以此来保证队列可以一直使用。

PS:循环数组的空和满的判别不能都是头尾指针相同,否则不知道是哪一种情况。所以要牺牲掉一个空间,使尾指针+1等于头指针时为满;尾指针等于头指针时为空。

代码:

#include <stdio.h>
#include <string.h>
//定义队列大小
#define SIZE 10
//创建队列
struct queue{
int q[SIZE];
int front;
int rear;
};
//初始化队列
void init_queue(struct queue* que)
{
que->front = 0;
que->rear = 0;
memset(que->q, 0x0, sizeof(que->q));
}
//入队列
int in_queue(struct queue* que, int data)
{
if((que->rear+1)%(SIZE) == que->front){
printf("queue full. \n");
return -1;
}
else {
que->q[que->rear] = data;
que->rear = (que->rear + 1)%(SIZE);	//超过数组个数时减数组大小,保证循环
}
}
//出队列
int out_queue(struct queue* que)
{
if(que->front == que->rear){
printf("queue empty. \n");
return -1;
}
int tmp = que->q[que->front];
que->front = ((que->front) + 1)%SIZE;

return tmp;
}
int set_null_queue(struct queue* que)
{
memset(que->q, 0x0, sizeof(que->q));
}
int main()
{
struct queue que;
init_queue(&que);

int i ;
for(i=0; i<9; i++)
in_queue(&que, 10+i);
int ret = 0;
printf("1st out: \n");
for(i=0; i<10; i++)
printf("%d\t",out_queue(&que));
printf("\n");
//---------------------------------------------------
for(i=0; i<3; i++)
in_queue(&que, 10+i);
printf("2nd out: \n");
for(i=0; i<5; i++)
printf("%d\t",out_queue(&que));
printf("\n");

set_null_queue(&que);

return 0;
}


结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息