【数据结构】队列的基本认识和队列的基本操作

本文详细介绍了队列这种数据结构,包括其基本概念、特点及两种实现方式:顺序队列和循环队列。探讨了队列的操作如入队、出队,并通过实例展示了队列在程序设计中的应用。
部署运行你感兴趣的模型镜像

一.队列的概念

队列是一种先进先出的线性表(栈是先进后出)。它只允许在表的一端进行插入,或者删除元素。 

  • 进入插入操作的一端称为队尾(rear)(入队列) 
  • 进行删除操作的一端称为对头(front)(出队列)  
  • 队列具有先进先出的(FIFO)的特性

    二.顺序队列   

1.队头不动,出队列时队头后的所有元素向前移动
 

缺陷:操作时如果是出队列比较多,需要大量搬移元素
队头不动---->大量搬移元素----->时间复杂度为O(n)

2.队头移动,出队列时队头向后移动一个位置
时间复杂度为O(1)

如果再有F,G进行入队列操作,就会出现假溢出问题
缺陷:容易造成队列假溢出 

对于假溢出和真溢出的理解:
假溢出:顺序队列因多次入队列和出队列操作后出现的尚有存储空间但是不能在进入队列操作的溢出
真溢出:顺序队列最大存储空间已经存满但是还要进行入队列操作所引起的溢出


队列初始条件:队头指针=队尾指针=0
队列满条件:队尾指针=size(设队列当前容量为size)
队列空条件:队头指针=队尾指针

queue.h
#pragma once 
#include<stdio.h>
#include<Windows.h>
#include<assert.h>

typedef int DataType;
#define SIZE 10

typedef struct Queue
{
	DataType arry[SIZE];
	int front;
	int rear;

}Queue;


//初始化队列
void QueueInit(Queue* q);

// 入队列
void QueuePush(Queue* q, DataType data);

// 出队列
void QueuePop(Queue* q);

// 获取队列顶元素 
DataType QueueTop(Queue* q);

// 获取队列中元素个数 
int QueueSize(Queue* q);

// 检测队列是否为空 
int QueueEmpty(Queue* q);

//销毁队列
void DestroyQueue(Queue* q);

//打印队列
void printQueue(Queue* q);

queue.c
#include"queue.h"



//初始化队列
void QueueInit(Queue*q)
{
	
	
	//初始化队列只需让队头指针和队尾指针都指向0
	q->front = q->rear = 0;
	return;

}


// 入队列
void QueuePush(Queue* q, DataType data)
{
	assert(q);
	if (SIZE == q->rear)
	{
		printf("栈溢出!!!");
			return;
	}
	else
	{
		q->rear++;

		q->arry[q->rear] = data;
		



	}

	return;
}

// 出队列
void QueuePop(Queue* q)
{
	if (q->front == q->rear )
	{
		printf("队列已空!!!");
		return;
	}
	else
	q->front++;


}

// 获取队列顶元素 
DataType QueueTop(Queue* q)
{
	if (q->front == q->rear)
	{
		printf("队列已空!!!");

		return 0;
	}

	return (q->arry[q->front]);

}

// 获取队列中元素个数 
int QueueSize(Queue* q)
{
	if (q->front == q->rear)
	{
		printf("队列已空!!!");

		return 0;
	}

	return (q->rear - q->front);

}

// 检测队列是否为空 
int QueueEmpty(Queue* q)
{
	if (q->front == q->rear)
	
		printf("队列已空!!!");

		return  0;


}

//销毁队列
void DestroyQeue(Queue* q)
{




}


//打印队列
void printQueue(Queue *q)
{
	if (q->front == q->rear)

	{
		printf("队列已空!!!\n");

		return;
	}

	Queue* p = q;
	
	while (p->rear != p->front )
	{
		p->front++;
		if (p->front < q->front + 1)
		{
			printf("%d->", p->arry[p->front]);

		}
		else
		{

			printf("%d->", p->arry[p->front]);
		}		

	}


	printf("\n");
}

test.c
#include"queue.h"

void QueueTest()
{
	Queue q;

	
	QueueInit(&q);

	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	QueuePush(&q, 5);
	

    QueuePop(&q);
	printQueue(&q);



}



int  main()
{
	QueueTest();

	system("pause");
	return 0;
}
后续会更新出循环队列和链式队列的基本操作以及队列的应用

栈的理解两者可以比较相互点击打开链接


您可能感兴趣的与本文相关的镜像

Linly-Talker

Linly-Talker

AI应用

Linly-Talker是一款创新的数字人对话系统,它融合了最新的人工智能技术,包括大型语言模型(LLM)、自动语音识别(ASR)、文本到语音转换(TTS)和语音克隆技术

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值