在此以前,已经了解过顺序表和链表了,那么如今要了解的栈和队列,从本质上来讲是基于上述俩个的,栈讲究“”后进先出”,而队列与之不一样,要求“先进先出”,对于栈来讲,根据规则,咱们了解到,栈的“入栈”即为“尾插”,栈的出栈也要找到“尾数据”,考虑到实用性,咱们的“栈“是基于顺序表完成的。这里就不细细展开了,而对于本次要讲的“队列”,根据使用规则,会发现,入队列相似“尾插”,出队列是“首”,所以,为了效率而言,“队列”会和单链表(此单链表具备尾指针,有尾指针弥补“尾插”效率)联系起来
下面咱们来完成一个简单但通用的“队列”
1.首先呢,为了方便操做,咱们创建一个本身的头文件·,(这个头文件后面会有引用),命名为 queue.h,顾名思义;node
#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来检测你写函数是否可用,这里我只展现部分,其他的操做能够本身按照需求加上去;ide
#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; }