C语言数据结构队列的概念及结构、队列的实现、队列结构的创建、初始化队列、销毁队列、入队列、出队列、获取队列元素个数、判断队列是否为空、获取队列头元素、获取队列尾元素、测试等的介绍

前言

C语言数据结构队列的概念及结构、队列的实现、队列结构的创建、初始化队列、销毁队列、入队列、出队列、获取队列元素个数、判断队列是否为空、获取队列头元素、获取队列尾元素、测试等的介绍


队列的概念及结构

  • 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
  • 入队列:进行插入操作的一端称为队尾
  • 出队列:进行删除操作的一端称为队头

在这里插入图片描述

队列的实现

  • 队列可以使用数组或者链表的结构实现。
  • 但是使用链表的结构实现更优一些。
  • 因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

一、 队列结构创建

队列结构的创建

typedef int QDataType;

typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;



typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
} Queue;

二、 初始化队列

初始化队列

// 初始化队列
void QInit(Queue* pq)
{
	assert(pq);

	pq->head = pq->tail = NULL;
	pq->size = 0;

}

三、 销毁队列

销毁队列定义

// 销毁队列
void QDestroy(Queue* pq)
{
	assert(pq);

	QNode* cur = pq->head;

	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

四、 入队列

入队列定义

// 入队列
void QPush(Queue* pq, QDataType x)
{
	assert(pq);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("QPush()::malloc()");
		return;
	}
	newnode->next = NULL;
	newnode->data = x;

	if (pq->head == NULL)
	{
		assert(pq->tail == NULL);
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = pq->tail->next;
	}
	pq->size++;
}

五、 出队列

出队列定义

// 出队列
void QPop(Queue* pq)
{
	assert(pq);
	assert(pq->head != NULL);

	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		QNode* cur = pq->head;
		pq->head = cur->next;

		free(cur);
		cur = NULL;
	}
	pq->size--;
	
}

六、 获取队列元素个数

获取队列元素个数定义

// 获取队列元素个数
int QSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

七、 判断队列是否为空

判断队列是否为空定义

// 判断队列是否为空
bool QEmpty(Queue* ps)
{
	assert(ps);

	return (ps->head == NULL && ps->tail == NULL);
}

八、 获取队列头元素

初始化结构定义

// 找到队列的头元素
QDataType QFront(Queue* ps)
{
	assert(ps);
	assert(!QEmpty(ps));

	return (ps->head->data);
}

九、 获取队列尾元素

初始化结构定义

// 找到队列的尾元素
QDataType QBack(Queue* ps)
{
	assert(ps);
	assert(!QEmpty(ps));

	return (ps->tail->data);
}

十、测试

测试

#include "Queue.h"

int main()
{

	Queue q = { 0 };

	// 初始化队列
	QInit(&q);

	// 入队列
	QPush(&q, 1);
	QPush(&q, 2);
	QPush(&q, 3);
	QPush(&q, 4);
	QPush(&q, 5);

	// 队列尾元素
	printf("%d\n", QBack(&q)); // 5

	// 获取队列中元素个数
	printf("%d\n", QSize(&q)); // 5


	while (!QEmpty(&q))
	{

		printf("%d ", QFront(&q)); // 1 2 3 4 5
		QPop(&q);
	}
	printf("\n");


	// 销毁队列
	QDestroy(&q);

	return 0;
}

效果如下:
在这里插入图片描述

leetcode队列实现栈

在这里插入图片描述


typedef int QDataType;

typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;



typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
} Queue;


// 初始化队列
void QInit(Queue* pq)
{
	assert(pq);

	pq->head = pq->tail = NULL;
	pq->size = 0;

}


// 销毁队列
void QDestroy(Queue* pq)
{
	assert(pq);

	QNode* cur = pq->head;

	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}


// 入队列
void QPush(Queue* pq, QDataType x)
{
	assert(pq);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("QPush()::malloc()");
		return;
	}
	newnode->next = NULL;
	newnode->data = x;

	if (pq->head == NULL)
	{
		assert(pq->tail == NULL);
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = pq->tail->next;
	}
	pq->size++;
}

// 出队列
void QPop(Queue* pq)
{
	assert(pq);
	assert(pq->head != NULL);

	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		QNode* cur = pq->head;
		pq->head = cur->next;

		free(cur);
		cur = NULL;
	}
	pq->size--;
	
}



// 获取队列元素个数
int QSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}


// 判断队列是否为空
bool QEmpty(Queue* pq)
{
	assert(pq);

	return (pq->head == NULL && pq->tail == NULL);
}


// 找到队列的头元素
QDataType QFront(Queue* pq)
{
	assert(pq);
	assert(!QEmpty(pq));

	return (pq->head->data);
}


// 找到队列的尾元素
QDataType QBack(Queue* pq)
{
	assert(pq);
	assert(!QEmpty(pq));

	return (pq->tail->data);
}


typedef struct {
    Queue q1;
    Queue q2;
} MyStack;


MyStack* myStackCreate() {
    MyStack* pst = (MyStack*)malloc(sizeof(MyStack));
    if(pst == NULL)
    {
        perror("myStackCreate malloc");
        return NULL;
    }

    QInit(&pst->q1);
    QInit(&pst->q2);

    return pst;
}

void myStackPush(MyStack* obj, int x) {
    if(!QEmpty(&obj->q1))
    {
        QPush(&obj->q1, x);
    }
    else
    {
        QPush(&obj->q2, x);
    }
}

int myStackPop(MyStack* obj) {
    Queue* empty = &obj->q1;
    Queue* nonempty = &obj->q2;

    if(!QEmpty(&obj->q1))
    {
        empty = &obj->q2;
        nonempty = &obj->q1;
    }

    while(QSize(nonempty) > 1)
    {
        QPush(empty, QFront(nonempty));
        QPop(nonempty);
    }

    int top = QFront(nonempty);
    QPop(nonempty);
    return top;
}

int myStackTop(MyStack* obj) {
    if(!QEmpty(&obj->q1))
    {
        return QBack(&obj->q1);
    }
    else
    {
        return QBack(&obj->q2);
    }
}

bool myStackEmpty(MyStack* obj) {
    return (QEmpty(&obj->q1) && QEmpty(&obj->q2));
}

void myStackFree(MyStack* obj) {
    QDestroy(&obj->q1);
    QDestroy(&obj->q2);

    obj = NULL;
}

/**
 * Your MyStack struct will be instantiated and called as such:
 * MyStack* obj = myStackCreate();
 * myStackPush(obj, x);
 
 * int param_2 = myStackPop(obj);
 
 * int param_3 = myStackTop(obj);
 
 * bool param_4 = myStackEmpty(obj);
 
 * myStackFree(obj);
*/

总结

C语言数据结构队列的概念及结构、队列的实现、队列结构的创建、初始化队列、销毁队列、入队列、出队列、获取队列元素个数、判断队列是否为空、获取队列头元素、获取队列尾元素、测试等的介绍

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
队列的引用实现可以使用指针来实现。具体实现方式如下: 1. 定义队列结构体,并在结构体中定义队列元素类型和指向队列的指针和指向队列的指针。 ```c typedef struct queue { int* data; // 队列元素类型 int front; // 队列指针 int rear; // 队列指针 } Queue; ``` 2. 实现队列初始化函数,根据队列长度动态分配内存,并将队列队列初始化为-1。 ```c void initQueue(Queue* q, int size) { q->data = (int*)malloc(sizeof(int) * size); q->front = -1; q->rear = -1; } ``` 3. 实现队列队函数,先判断队列是否已满,如果已满则返回错误,否则将元素队列部,并将队列指针后移。 ```c bool enqueue(Queue* q, int x) { if (q->rear == size - 1) { return false; // 队列已满,插失败 } else { q->data[++q->rear] = x; return true; } } ``` 4. 实现队列队函数,先判断队列是否为空,如果为空则返回错误,否则将队列指针后移,并返回队列元素。 ```c bool dequeue(Queue* q, int* x) { if (q->front == q->rear) { return false; // 队列为空,队失败 } else { *x = q->data[++q->front]; return true; } } ``` 5. 实现队列销毁函数,释放队列内存空间。 ```c void destroyQueue(Queue* q) { free(q->data); } ``` 完整代码实现如下: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef struct queue { int* data; int front; int rear; } Queue; void initQueue(Queue* q, int size) { q->data = (int*)malloc(sizeof(int) * size); q->front = -1; q->rear = -1; } bool enqueue(Queue* q, int x) { if (q->rear == size - 1) { return false; } else { q->data[++q->rear] = x; return true; } } bool dequeue(Queue* q, int* x) { if (q->front == q->rear) { return false; } else { *x = q->data[++q->front]; return true; } } void destroyQueue(Queue* q) { free(q->data); } int main() { Queue q; int size = 10; initQueue(&q, size); for (int i = 0; i < size; i++) { enqueue(&q, i); } int x; while (dequeue(&q, &x)) { printf("%d ", x); } printf("\n"); destroyQueue(&q); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值