顺序队列与链式队列

博客介绍了队列这一逻辑结构,其有两个端口,一个进一个出,具有先进先出的特性,且与栈都是功能受限的表。还提及了队列的分类,包括顺序队列和链式队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列(逻辑结构)
限制为有个端口进出元素,一个只管进,另一个只管出,就导致先进先出和特性。
队列与栈都是功能受限的表。
顺序队列、链式队列

顺序队列:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define TYPE int

typedef struct Queue//结构体
{
	TYPE* base;
	int size;	// 容量
	int head;	// 队头
	int tall;	// 队尾
	int cnt; 	// 数量
}Queue;

// 创建
Queue* creat_queue(int len);
// 销毁
void destory_queue(Queue* queue);
// 队空
bool empty_queue(Queue* queue);
// 队满
bool full_queue(Queue* queue);
// 入队
bool push_queue(Queue* queue,TYPE data);
// 出队
bool pop_queue(Queue* queue);
// 队头
TYPE* head_queue(Queue* queue);
// 队尾
TYPE* tall_queue(Queue* queue);

int main()
{
	Queue* queue = creat_queue(10);
	for(int i=0; i<15; i++)
	{
		printf("入队%s,",push_queue(queue,i)?"成功":"失败");
		printf("队尾:%d\n",*tall_queue(queue));
	}
	printf("---------------------\n");
	for(int i=0; i<5; i++)
	{
		printf("队头:%d,",*head_queue(queue));
		printf("出队%s\n",pop_queue(queue)?"成功":"失败");
	}
	printf("---------------------\n");
	for(int i=77; i<88; i++)
	{
		printf("入队%s,",push_queue(queue,i)?"成功":"失败");
		printf("队尾:%d\n",*tall_queue(queue));
	}
}

// 创建
Queue* creat_queue(int len)
{
	Queue* queue = malloc(sizeof(Queue));
	queue->base = malloc(sizeof(TYPE)*len);//首地址
	queue->head = queue->cnt = 0;
	queue->tall = -1;
	queue->size = len;
	return queue;
}

// 销毁
void destory_queue(Queue* queue)
{
	free(queue->base);
	free(queue);
}

// 队空
bool empty_queue(Queue* queue)
{
	return !queue->cnt;
}

// 队满
bool full_queue(Queue* queue)
{
	return queue->cnt >= queue->size;
}

// 入队
bool push_queue(Queue* queue,TYPE data)
{
	// 判断是队满
	if(full_queue(queue)) return false;

	// 回头
	queue->tall = (queue->tall+1) % queue->size;//容量一定,queue->tall+1不断加1,相余,余出的结果用于确定队尾位置
	queue->base[queue->tall] = data;//入队
	queue->cnt++;//数量自加1
	return true;
}

// 出队
bool pop_queue(Queue* queue)
{
	// 判断是否队空
	if(empty_queue(queue)) return false;

	// 回头
	queue->head = (queue->head+1) % queue->size;
	queue->cnt--;
	return true;
}

// 队头
TYPE* head_queue(Queue* queue)
{
	if(empty_queue(queue)) return NULL;//判断是否队空
	return queue->base + queue->head;//首地址加偏移(队头的偏移),等于队头的地址
}

// 队尾
TYPE* tall_queue(Queue* queue)
{
	if(empty_queue(queue)) return NULL;//判断是否队空
	return queue->base + queue->tall;//同上
}

链式队列

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define TYPE int

typedef struct Node
{
	TYPE data;
	struct Node* next;
}Node;

Node* crete_node(TYPE data)
{
	Node* node = malloc(sizeof(Node));
	node->data = data;
	node->next = NULL;
	return node;
}

typedef struct Queue
{
	Node* head;
	Node* tail;
	size_t size;
}Queue;

// 创建
Queue* creat_queue(void)
{
	Queue* queue = malloc(sizeof(Queue));
	queue->head = NULL;
	queue->tail = NULL;
	queue->size = 0;
	return queue;
}

// 队空
bool empty_queue(Queue* queue)
{
	return 0 == queue->size;
}


// 出队
bool pop_queue(Queue* queue)
{
	if(empty_queue(queue)) return false;

	Node* node = queue->head;
	queue->head = node->next;
	
	if(1 == queue->size) queue->tail = NULL;

	free(node);
	queue->size--;
	return true;
}


// 销毁
void destory_queue(Queue* queue)
{
	while(pop_queue(queue));
	free(queue);
}

// 入队
void push_queue(Queue* queue,TYPE data)
{
	Node* node = crete_node(data);
	if(empty_queue(queue))
	{
		queue->head = node;
		queue->tail = node;
	}
	else
	{
		queue->tail->next = node;
		queue->tail = node;
	}
	queue->size++;
}

// 队头
TYPE* head_queue(Queue* queue)
{
	if(empty_queue(queue)) return NULL;
	return &queue->head->data;
}

// 队尾
TYPE* tail_queue(Queue* queue)
{
	if(empty_queue(queue)) return NULL;
	return &queue->tail->data;
}

int main()
{
	Queue* queue = creat_queue();
	for(int i=0; i<10; i++)
	{
		push_queue(queue,i);
		printf("队尾:%d\n",*tail_queue(queue));
	}
	printf("--------------------\n");
	for(int i=0; i<10; i++)
	{
		printf("队头:%d,",*head_queue(queue));
		printf("出队%s\n",pop_queue(queue)?"成功":"失败");
	}
}
  • ps:今天杭州又又又满水,好臭啊啊啊啊啊!!!排水系统什么时候能弄好!可怜了我的新鞋子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值