队列与循环队列
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; }
结果:
相关文章推荐
- c语言数据结构中循环队列操作,包括初始化,创建,清空销毁,增添,删除,求队长,遍历等等
- 数据结构——队列及循环队列
- 循环队列
- (002)循环队列的两种C/C++实现
- 数据结构之循环队列c语言实现
- 数据结构:循环队列(C语言实现)
- 循环队列,类之间的互动
- 串口中断----数组循环队列
- JavaScript队列、优先队列与循环队列
- 循环队列的实现 推荐
- 深入理解循环队列----循环数组实现ArrayDeque
- 数据结构--循环队列的基本操作
- 数据结构基础(7) --循环队列的设计与实现
- 【九度】题目1415:不一样的循环队列
- java使用数组实现循环队列
- java实现循环队列
- 循环队列的探索
- 队列-循环队列及其实现
- POJ 3126 Prime Path 第一道BFS 循环队列,AC的很辛苦!
- Atitit.升级软件的稳定性---基于数据库实现持久化 循环队列 循环队列