在此之前,已经了解过顺序表和链表了,那么现在要了解的栈和队列,从本质上来说是基于上述俩个的,栈讲究“”后进先出”,而队列与之不同,要求“先进先出”,对于栈来说,根据规则,我们了解到,栈的“入栈”即为“尾插”,栈的出栈也要找到“尾数据”,考虑到实用性,我们的“栈“是基于顺序表完成的。这里就不细细展开了,而对于本次要讲的“队列”,根据使用规则,会发现,入队列类似“尾插”,出队列是“首”,因此,为了效率而言,“队列”会和单链表(此单链表具有尾指针,有尾指针弥补“尾插”效率)联系起来
下面我们来完成一个简单但通用的“队列”
1.首先呢,为了方便操作,我们建立一个自己的头文件·,(这个头文件后面会有引用),命名为 queue.h,顾名思义;
#pragma once
#include <stdlib.h>
#include <stdio.h>
typedef int QDataType;
typedef struct QNode//创建一个结构体来放需要用到的Node
{
struct QNode* _next;//自己的指针
QDataType _data;
}QNode;
typedef struct Queue
{
QNode* _front;//首
QNode* _rear;/尾
QNode* _size;//此处size的创建便于后面检查队列满与空
}Queue;
void queueInit(Queue* q);//初始化一个队列
QNode* creatNode(QDataType data);//自己想使用的数据
void queuePush(Queue* q, QDataType data);//入队列
void queuePop(Queue* q);//出队列
QDataType queueFront(Queue* q)//获取头;
QDataType queueBack(Queue* q);//获取尾
int queueSize(Queue* q);//多大
int queueEmpty(Queue* q);//判空
void queueDestory(Queue* q);//销毁
2,这里是我们完成所需要的的函数的主要完成区域,我命名为 Queue.c,在这里完成函数,为test引用做准备;
#define _CRT_SECURE_NO_WARNINGS 1
#include "queue.h"
void queueInit(Queue* q)
{
q->_front = q->_rear = NULL;
q->_size = 0;
}
QNode* creatNode(QDataType data)
{
QNode* node = (QNode*)malloc(sizeof(QNode));
node->_data = data;
node->_next = NULL;
return node;
}
void queuePush(Queue* q,QDataType data)
{
QNode* node = creatNode(data);
if (q->_front == NULL)
q->_front = q->_rear = node;
else
{
q->_rear->_next = node;
q->_rear = node;
++q->_size;
}
}
void queuePop(Queue* q)
{
/*if (q->_front == NULL)
return;
if (q->_front == q->_rear)
{
q->_front = q ->_rear = NULL;
}
else{
QNode* next = q->_front;
free(q->_front);
q->_front = next;
}*/
if (q->_front)
{
QNode* next = q->_front->_next;
free(q->_front);
q->_front = next;
if (q->_front == NULL)
q->_rear = NULL;
--q->_size;
}
}
QDataType queueFront(Queue* q)
{
/*if (q->_front == NULL)
return "NULL";*/
return q->_front->_data;
}
QDataType queueBack(Queue* q)
{
return q->_rear->_data;
}
int queueSize(Queue* q)
{
return q->_size;
}
int queueEmpty(Queue* q)
{
if (q->_front == NULL)
return 1;
return 0;
}
void queueDestory(Queue* q)
{
QNode* cur = q->_front;
while (cur)
{
QNode* next = cur->_next;
free(cur);
cur = next;
}
q->_front = q->_rear = NULL;
q->_size = 0;
}
3,这里是我们自己的操作区域哈哈,通过测试函数test来检测你写函数是否可用,这里我只展示部分,其余的操作可以自己按照需求加上去;
#define _CRT_SECURE_NO_WARNINGS 1
#include "queue.h"
void test1()
{
Queue q;
queueInit(&q);
queuePush(&q, 1);//接口处传&q,传的是已经创建好的队列,数字即为data,
queuePush(&q, 2);
queuePush(&q, 3);
queuePush(&q, 4);
queuePop(&q);
queuePop(&q);
queuePop(&q);
queuePop(&q);
}
int main()
{
test1();
return 0;
}
来源:51CTO
作者:wx5de7cc3c00d8e
链接:https://blog.51cto.com/14632688/2485527