队列的基本操作

队列的概念:
1.只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表
2.进行插入操作的一端称为队尾(入队列)
3.进行删除操作的一端称为队头(出队列)
4.队列具有先入先出的特性

本节我们先以链式结构为基础讲解队列,下面我们上代码:

LinkQueue.h

#include <stdio.h>
#include<stdlib.h>
typedef char LinkQueueType;

typedef struct LinkQueueNode{
LinkQueueType data;
struct LinkQueueNode* next;
}LinkQueueNode;

typedef struct LinkQueue{
LinkQueueNode* head;
LinkQueueNode* tail;
}LinkQueue;

void LinkQueueInit(LinkQueue* q);//初始化
void LinkQueuePush(LinkQueue* q, LinkQueueType value);//入队列
void LinkQueuePop(LinkQueue* q);//出队列
int LinkQueueTop(LinkQueue* q, LinkQueueType* value);//取队首元素

void LinkQueueDestroy(LinkQueue* q);//销毁

LinkQueue.c

#include "LinkQueue.h"
void LinkQueueInit(LinkQueue* q)
{
if (q == NULL){
return;
}
q->head = NULL;
q->tail = NULL;
}
LinkQueue* CreatNode(LinkQueueType value){
LinkQueueNode* New_Node = (LinkQueue*)malloc(sizeof(LinkQueue));
New_Node->data = value;
New_Node->next = NULL;
return New_Node;
}
void LinkQueuePush(LinkQueue*q, LinkQueueType value)
{
if (q == NULL){
return;
}
LinkQueueNode* New_Node = CreatNode(value);
if (q->tail == NULL){
q->head = q->tail = New_Node;
}
else{
q->tail->next = New_Node;
q->tail = q->tail->next;
return;
}
}
void LinkQueuePop(LinkQueue* q)
{
if (q == NULL){
return;
}
if (q->head == NULL){
return;
}
LinkQueueNode* to_delete = q->head;
q->head = q->head->next;
free(to_delete);
}
int LinkQueueTop(LinkQueue* q, LinkQueueType* value)
{
if (q == NULL){
//非法输入
return 0;
}
if (value == NULL || q->head == NULL){
return 0;
}
*value = q->head->data;
return 1;
}
void LinkQueueDestroy(LinkQueue* q)
{
if (q == NULL){
return;
}
do{
LinkQueuePop(q);
} while (q->head != NULL);
return;
}
///测试代码/
#define TestHeader printf("\n======================%s=====================\n",__FUNCTION__)
void LinkQueuePrint(LinkQueue* q, const char* msg){
if (q == NULL){
return;
}
printf("[%s]\n", msg);
printf("[队头]");
LinkQueueNode* cur = q->head;
for (; cur != NULL; cur = cur->next){
printf(" [%c] ", cur->data);
}
printf("[队尾]\n");
return;
}


void TestInit(){
TestHeader;
LinkQueue q;
LinkQueueInit(&q);
LinkQueuePrint(&q, "对栈式队列进行初始化");
}
void TestQueuePush(){
TestHeader;
LinkQueue q;
LinkQueueInit(&q);
LinkQueuePush(&q, 'a');
LinkQueuePush(&q, 'b');
LinkQueuePush(&q, 'c');
LinkQueuePush(&q, 'd');
LinkQueuePrint(&q, "入队列四个元素");
}
void TestQueuePop(){
TestHeader;
LinkQueue q;
LinkQueueInit(&q);
LinkQueuePush(&q, 'a');
LinkQueuePush(&q, 'b');
LinkQueuePush(&q, 'c');
LinkQueuePush(&q, 'd');
LinkQueuePrint(&q, "入队列四个元素");
LinkQueuePop(&q);
LinkQueuePop(&q);
LinkQueuePrint(&q, "出队列两个元素");
}
void TestQueueTop(){
TestHeader;
LinkQueue q;
LinkQueueInit(&q);
LinkQueuePush(&q, 'a');
LinkQueuePush(&q, 'b');
LinkQueuePush(&q, 'c');
LinkQueuePush(&q, 'd');
LinkQueuePrint(&q, "入队列四个元素");
char tmp;
int ret=LinkQueueTop(&q, &tmp);
printf("expect 1,actual %d\n", ret);
printf("enpect a,actual %c", tmp);
}
void TestQueueDestroy(){
TestHeader;
LinkQueue q;
LinkQueueInit(&q);
LinkQueuePush(&q, 'a');
LinkQueuePush(&q, 'b');
LinkQueuePush(&q, 'c');
LinkQueuePush(&q, 'd');
LinkQueuePrint(&q, "入队列四个元素");
LinkQueueDestroy(&q);
LinkQueuePrint(&q,"销毁队列");


}
int main(){
TestInit();
TestQueuePush();
TestQueuePop();
TestQueueTop();
TestQueueDestroy();
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值