一篇写的很好的关于队列的文章:
http://www.cnblogs.com/kubixuesheng/p/4104802.html
#include<stdio.h>
#include<stdlib.h>
#define SIZE 100
/*
* 队列演示(队列的几个函数)
* */
typedef struct {
int arr[SIZE];
int head; //记录最前面数字所在的下标
int tail; //记录最后一个有效数字的下一个坐标
//如果队列里一个数都没有的话head=tail
} Queue;
//队列的初始化函数
void queue_init(Queue *p_queue) {
p_queue->head = 0;
p_queue->tail = 0;
}
//队列清理函数
void queue_deinit(Queue *p_queue) {
p_queue->head = 0;
p_queue->head = 0;
}
//计算数字个数
int queue_size(const Queue *p_queue) {
return (p_queue->tail - p_queue->head);
}
//判断队列是否为空
int queue_empty(const Queue *p_queue) {
return !(p_queue->tail - p_queue->head);
}
//判断队列是否满的
int queue_full(const Queue *p_queue) {
return p_queue->tail >= SIZE;//tail当吧最后一个SIZE-1使用后变为SIZE,为保险要大于
}
//向队列里加入数字
int queue_push(Queue *p_queue, int val) {
if (queue_full(p_queue)) {
return 0;
}
else {
p_queue->arr[p_queue->tail] = val;
p_queue->tail++;
return 1;//表示将数字加进去了
}
}
//从队列里获得数字的(会把数字从队列里删除)
int queue_pop(Queue *p_queue, int *p_num) {
if (queue_empty(p_queue)) {
return 0;
}
else {
*p_num = p_queue->arr[p_queue->head];//因为要删除,所以先给
p_queue->head++;//将取过的数跳过去
return 1;
}
}
//从队列里获得数字(不会把数字从队列删除)
int queue_front(const Queue *p_queue, int *p_num) {
if (queue_empty(p_queue)) {
return 0;
}
else {
*p_num = p_queue->arr[p_queue->head];//多次调用是同一个数
return 1;
}
}
void main() {
Queue qu;
int y;
queue_init(&qu);
queue_push(&qu, 1);
queue_push(&qu, 2);
queue_push(&qu, 3);
queue_push(&qu, 4);
printf(">>>%d\r\n", queue_size(&qu));
// 拿出一个数据,数据还在
queue_front(&qu, &y);
printf(">%d\r\n", y);
printf(">>%d\r\n", queue_size(&qu));
// 取出一个数据,数据已经被删除
queue_pop(&qu, &y);
printf(">%d\r\n", y);
printf(">>%d\r\n", queue_size(&qu));
// 插入一个数据
queue_push(&qu, 5);
queue_pop(&qu, &y);
printf(">%d\r\n", y);
printf(">>%d\r\n", queue_size(&qu));
// while (qu.tail != qu.head) {
// qu.head = qu.head + 1;
// printf("当前队列值=%d\n", qu.arr[qu.head]);
// }
}
顺序队列中有二维数组
#include<stdio.h>
#include<stdlib.h>
#define SIZE 3
/*
* 队列演示(队列的几个函数)
* */
typedef struct {
char arr[SIZE][20];
int head; //记录最前面数字所在的下标
int tail; //记录最后一个有效数字的下一个坐标
//如果队列里一个数都没有的话head=tail
} Queue;
//队列的初始化函数
void queue_init(Queue *p_queue) {
p_queue->head = 0;
p_queue->tail = 0;
}
//队列清理函数
void queue_deinit(Queue *p_queue) {
p_queue->head = 0;
p_queue->head = 0;
}
//计算数字个数
int queue_size(const Queue *p_queue) {
return (p_queue->tail - p_queue->head);
}
//判断队列是否为空
int queue_empty(const Queue *p_queue) {
return !(p_queue->tail - p_queue->head);
}
//判断队列是否满的
int queue_full(const Queue *p_queue) {
return p_queue->tail >= SIZE;//tail当吧最后一个SIZE-1使用后变为SIZE,为保险要大于
}
//向队列里加入数字
int queue_push(Queue *p_queue, char* val) {
if (queue_full(p_queue)) {
return 0;
}
else {
strcpy(p_queue->arr[p_queue->tail], val);
p_queue->tail++;
return 1;//表示将数字加进去了
}
}
//从队列里获得数字的(会把数字从队列里删除)
int queue_pop(Queue *p_queue, char *p_num) {
if (queue_empty(p_queue)) {
return 0;
}
else {
strcpy(p_num, p_queue->arr[p_queue->head]);//因为要删除,所以先给
p_queue->head++;//将取过的数跳过去
return 1;
}
}
//从队列里获得数字(不会把数字从队列删除)
int queue_front(const Queue *p_queue, char *p_num) {
if (queue_empty(p_queue)) {
return 0;
}
else {
strcpy(p_num, p_queue->arr[p_queue->head]);
return 1;
}
}
int queue_printf(const Queue *p_queue){
int i;
if (queue_empty(p_queue)) {
return 0;
}
else {
for (i = p_queue->head; i < p_queue->tail; i++)
printf("%s\r\n", p_queue->arr[i]);
}
}
void main() {
Queue qu;
char y[5][100];
queue_init(&qu);
queue_push(&qu, "hello 1\r\n");
queue_push(&qu, "hello 2\r\n");
queue_push(&qu, "hello 3\r\n");
queue_printf(&qu); // 打印队列中的所有节点
printf("队列的长度:%d\r\n", queue_size(&qu)); // 打印队列的长度
queue_pop(&qu, y[0]);
printf(">>>>%s\r\n", y[0]);
printf("队列的长度:%d\r\n", queue_size(&qu)); // 打印队列的长度
queue_push(&qu, "hello china\r\n"); // 拿出来一条,再加一条
queue_printf(&qu); // 打印队列中的所有节点
}
循环队列
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//队列的结点结构
typedef struct Node {
char data[100];
struct Node *next;
} Node, *Queue;
//队列的结构,嵌套
typedef struct {
Queue front;
Queue rear;
} LinkQueue;
//初始化
//开始必然是空队列,队尾指针和队头指针都指向头结点
void initQueue(LinkQueue *queue)
{
//初始化头结点
queue->front = queue->rear = (Queue)malloc(sizeof(Node));
if (NULL == queue->front) {
exit(0);
}
queue->front->next = NULL;
}
//判空
bool isEmpty(LinkQueue queue)
{
return queue.rear == queue.front ? true : false;
}
//入队,只在一端入队,另一端出队,同样入队不需要判满
void insertQueue(LinkQueue *queue, char* temp)
{
Queue q = (Queue)malloc(sizeof(Node));
if (NULL == q) {
exit(0);
}
//插入数据
strcpy(q->data, temp);
q->next = NULL;
//rear 总是指向队尾元素
queue->rear->next = q;
queue->rear = q;
}
//出队,需要判空(删除数据)
void deleteQueue(LinkQueue *queue)
{
Queue q = NULL;
if (!isEmpty(*queue)) {
q = queue->front->next;
queue->front->next = q->next;
//这句很关键,不能丢
if (queue->rear == q) {
queue->rear = queue->front;
}
free(q);
}
}
// 出队,需要判空(不删除数据)
void getQueue(LinkQueue *queue, char *data)
{
Queue q = NULL;
if (!isEmpty(*queue)) {
strcpy(data, queue->front->next->data);
data[strlen(data)] = '\0';
}
}
//遍历
void traversal(LinkQueue queue)
{
int i = 1;
Queue q = queue.front->next;
while (q != NULL) {
printf("队列第%d个元素是:%s\n", i, q->data);
q = q->next;
i++;
}
}
//销毁
void destoryQueue(LinkQueue *queue)
{
while (queue->front != NULL) {
queue->rear = queue->front->next;
free(queue->front);
queue->front = queue->rear;
}
puts("销毁成功!");
}
int main(int argc, const char * argv[])
{
LinkQueue queue;
char strAims[50];
puts("初始化队列 queue");
initQueue(&queue);
traversal(queue);
puts("队尾依次插入0 1 2 3");
insertQueue(&queue, "hello 1");
insertQueue(&queue, "hello 2");
insertQueue(&queue, "hello 3");
insertQueue(&queue, "hello 4");
traversal(queue);
puts("先进先出,删除队列从头开始, 0 ");
deleteQueue(&queue);
traversal(queue);
insertQueue(&queue, "hello 5");
getQueue(&queue, strAims);
printf(">>%s\r\n", strAims);
puts("先进先出,删除队列从头开始, 1 ");
deleteQueue(&queue);
traversal(queue);
getQueue(&queue, strAims);
printf(">>%s\r\n", strAims);
puts("先进先出,删除队列从头开始, 2 ");
deleteQueue(&queue);
traversal(queue);
puts("先进先出,删除队列从头开始, 3");
deleteQueue(&queue);
traversal(queue);
destoryQueue(&queue);
return 0;
}