队列

举报
tianchou 发表于 2023/11/14 19:34:45 2023/11/14
【摘要】 描述了有关数据结构——队列的常用操作

title: 【对列】
date: 2023-09-28 21:18:45
tags: 数据结构

一:循环队列

循环队列的引入是为了克服==“假上溢”现象==。

1、存储结构

#define MAXQSIZE 100
typedef struct
{
	ElementType* base;
	int front;
	int rear;
}Queue;

front和rear是头尾指针(相对于数组),front指向第一个元素,rear指向最后一个元素的==下一个位置==

2、初始化

void InitQueue(Queue& q)
{
	q.base = new ElementType[MASQSIZE];//开辟空间
	if (!q.base) 	exit(OVERFLOW);//存储分配失败
	q.front = q.rear = 0;
}

3、入队

Status EnQueue(Queue& q, ElementType e)
{
	if ((q.rear + 1) % MAXQSIZE == q.front)
		return ERROR;		//队满
	q.base[q.rear] = e;
	q.rear = (q.rear + 1) % MAXQSIZE;
	return OK;
}

3、出队

Status DeQueue(Queue& q, ElementType &e)
{
	if (q.front == q.rear)
		return ERROR;		//队空
	e = q.base[q.front];
	q.front = (q.front + 1) % MAXQSIZE;
	return OK;
}

4、队列长度

int QueueLength(Queue q)
{
    return ( q.rear - q.front + MAXQSIZE ) % MAXQSIZE;
}

5、队满

int QueueFull(Queue q)
{
    return ( q.rear + 1 ) % MAXQSIZE == q.front;
}

二、链队列

image-20230928211711116

链队头结点

1、存储结构

typedef struct Node
{
	ElementType data;
	struct Node* next;
}Node;
typedef struct
{
	Node* front;//队头指针
	Node* rear;//队尾指针
}Queue;

2、链队的初始化

Status InitQueue(Queue& Q)
{
	Q.front = Q.rear = new Node;
	if(!Q.front)	 exit(OVERFLOW);
	Q.front->next = NULL;
	return OK;
}

3、链队的入队

image-20230928211729867

Status EnQueue(Queue& Q, ElementType x)
{
	p = new Node;
	if (!p) 	exit(OVERFLOW);		//存储分配失败
	p->data = x;
	p->next = NULL;
//头插法    
	Q.rear->next = p;
	Q.rear = p;
	return OK;
}

4、链队的出队

image-20230928211745037

Status DeQueue(Queue& Q, ElementType& x)
{
	if (Q.front == Q.rear)
		return ERROR;	//队列为空
	p = Q.front->next;	//p指向队头元素
	x = p->data;		//e保存队头元素的值
	Q.front->next = p->next;	
    if (Q.rear == p)	//如果最后一个元素被删,则队尾指针为空
		Q.rear = NULL;	
	free(p);		//释放原队头元素的空间
	return OK;
}
  如果队列Q中==**<font color='red'>最后一个元素被删除</font>**==了,则队列中没有元素了,
  • Q.rear不指向任何元素,要修改并赋值NULL
  • Q.front由于是头结点,所以其值始终不会改变

例题

例一

image-20221216122834047

不设置头结点,就必须考虑

  1. 初始时==链表是否为空==
  2. 是否在**第一个结点前插入新结点**
  3. 是否**删除结点后链表为空**

13315216532604079

void EnQueue(node* rear,ElementType x)
{
    node* p=new node;
    p->data=x;
    if(rear==NULL)		//队列为空
    {	
        p->next=p;		
        rear=p;   
    }
    else
    {
        p->next=rear->next;
        rear->next=p;
        rear=p;
    }
}


status DeQueue(ElementType &x,node* rear)
{
    if(rear==NULL)		return ERROR;       
    node* p=rear->next;
    x=p->data;
    if(p==rear)		//删除后队列为空
        rear=NULL;
    else
        rear->next=p->next;
    free(p);
    return OK;
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。