考研数据结构---线性表---队列

本文主要介绍了队列及其存储结构。队列是操作受限的线性表,操作特性为先进先出。其存储结构包括顺序存储和链式存储。顺序存储通常由数组和头尾指针组成,还有循环队列这种特殊形式;链式存储则是带有头尾指针的单链表,并分别介绍了它们的定义、初始化及入队、出队等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列

def-队列是一种操作受限的线性表,与栈相同也不同,不同的是队列是在一端进入(入队)另一端出去(出队)。操作特性是先进先出

队列的顺序存储结构

通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录尾元素位置的变量rear组成。

1.队列的顺序存储结构定义

#define MaxSize 100
//队列顺序存储结构定义
typedef struct {
	int data[MaxSize];		//存放队列元素
	int front, rear;		//队的头指针和尾指针,不是真正的指针而是对应数组的下标
}SqQueue,*Queue;

初始状态(队空条件):Q.front == Q.rear==0
进队操作: 队不满时,先送值到队尾元素,再将队尾指针(下标)加1
出队操作: 队不空时,先取队头元素值,再将队头指针加1

循环队列
将顺序队列改造为一个环状的空间,称为循环队列
初始状态:Q.front=Q.rear=0
队首指针进1:Q.front=(Q.front+1)%MaxSize
队尾指针进1:Q.rear=(Q.rear+1)%MaxSize
队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
2.循环队列初始化

	void InitQueue(SqQueue &Q)
{
	Q.rear = Q.front = 0;			//初始化队首、队尾指针
}

3.判断循环队列是否为空

bool isEmpty(SqQueue Q)
{
	if (Q.rear == Q.front)
	{
		return true;
	}
	else {
		return false;
	}
}

4.入队操作

bool EnQueue(SqQueue &Q, int x)
{
	if ((Q.rear + 1) % MaxSize == Q.front)
		return false;		//队满
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1) % MaxSize;
	return true;
}

5.出队操作

bool DeQueue(SqQueue &Q, int &x)
{
	if (Q.rear == Q.front)
		return false;		//队空
	x = Q.data[Q.front];
	Q.front = (Q.front + 1) % MaxSize;	//对头指针加1取模
	return true;
}

队列的链式存储结构

实际上,队列的链式存储结构就是带有队头指针队尾指针单链表

1.队列链式存储结构定义

typedef struct {
	int data;
	struct LinkNode * next;
}LinkNode;
typedef struct {
	LinkNode *front,*rear;

}LinkQueue;

2.链式队列的初始化

void InitQueue(LinkQueue &Q)
{
	Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));	//建立头结点,注意这里分配空间的是队列的指针,所以应该用指针的类型
	Q.front->next = NULL;		//初始为空
}

3.判断空

bool IsEmpty(LinkQueue Q)
{
	if (Q.front == Q.rear)
		return true;
	else
		return false;
}

4.入队

void EnQueue(LinkQueue &Q, int x)
{
	LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
	s->data = x;
	s->next = NULL;		//创建新的结点,插入到队尾
	Q.rear->next = s;
	Q.rear = s;

}

5.出队

bool DeQueue(LinkQueue &Q, int &x)
	{
		if (Q.front = Q.rear)
			return false;	//空队
		LinkNode *p = Q.front->next;
		x = p->data;
		Q.front->next = p->next;
		if (Q.rear == p)
			Q.rear = Q.front;		//若原队列中有一个节点,删除后变为空
		free(p);
		return true;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值