C语言--数据结构--模板(一)--队列(queue)

121 篇文章 21 订阅

一篇写的很好的关于队列的文章:
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;
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值