队列基本操作

08月28日 收藏 0 评论 4 java开发

队列基本操作

转载声明:文章来源 https://blog.csdn.net/zhang21722668/article/details/82155301

1.队列的概念
只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表;进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列);队列具有先进先出(FIFO)的特性。

2.顺序队列
(1)队头不动,出队列时队头后的所有元素向前移动

缺陷:操作是如果出队列比较多,要搬移大量元素。

(2)队头移动,出队列时队头向后移动一个位置

如果还有新元素进行入队列容易造成假溢出。

假溢出:顺序队列因多次入队列和出队列操作后出现的尚有存储空间但不能进行入队列操作的溢出。
真溢出:顺序队列的最大存储空间已经存满二又要求进行入队列操作所引起的溢出。
3.循环队列

循环队列如何进行判空和满操作:

少用一个存储单元
设置一个标记flag;
初始值 flag = 0;入队列:flag = 1; 出队列:flag = 0;
队列为空时:(front == rear && flag == 0)
队列为满时:(front == rear && flag == 1)
设置一个计数器
4.链式队列
链式队列:特殊的单链表,只在单链表上进行头删尾插的操作
***【1.定义一个队列结构体】***】

由于是链式队列,所以先定义一个存放数据域和指针域的结构体
队列结构体中定义一个队头指针和队尾指针

typedef int QElemType;
//typedef struct BTNode* QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *_pNext;
}QNode;

typedef struct LQueue
{
QNode *pFront;
QNode *pRear;
}LQueue;

【2.创建新结点】

//创建新结点
static QNode *BuyLQNode(QElemType data)
{
QNode *pLQNode = (QNode *)malloc(sizeof(QNode));
if (NULL == pLQNode)
{
printf("申请空间失败!\n");
assert(pLQNode);
}
pLQNode->data = data;
pLQNode->_pNext = NULL;

return pLQNode;
}

【3.初始化队列】

让队列的队头,队尾分别指向空

void LQueueInit(LQueue *q)
{
assert(q);
q->pFront = q->pRear = NULL;
}

【4.入队列】

判断队中是否有元素
找到队尾元素
让新入队的元素链在原先队列的队尾上,更新新的队尾

void LQueuePush(LQueue *q, QElemType data)
{
assert(q);
if (NULL == q->pFront)
{
q->pFront = q->pRear = BuyLQNode(data);
return;
}
q->pRear->_pNext = BuyLQNode(data);
q->pRear = q->pRear->_pNext;
}

【5.出队列】

这里的出队列采用是让队头元素不断后移,刷新队头元素,这样优化时间效率

void LQueuePop(LQueue *q)
{
assert(q);
QNode *pDel;
if (NULL == q->pFront)
{
return;
}

if (q->pFront == q->pRear)
{
q->pRear = NULL;
}

pDel = q->pFront;
q->pFront = q->pFront->_pNext;
free(pDel);
}

【6.返回队头元素】

直接返回队头元素

QElemType LQueueTop(LQueue *q)
{
assert(q);
return q->pFront->data;
}

【7.返回队尾元素】

直接返回队尾元素

QElemType LQueueBack(LQueue *q)
{
assert(q);
return q->pRear->data;
}

【8.计算队列长度】

定义一个变量count
将队列从头到尾遍历,每访问一个元素count加1一下
最后count的值就是队列长度

int LQueueSize(LQueue *q)
{
int count = 0;
QNode *pCur;
assert(q);
pCur = q->pFront;
while (pCur)
{
pCur = pCur->_pNext;
count++;
}
return count;
}

【9.队列判空操作】

int LQueueEmpty(LQueue *q)
{
return NULL == q->pFront;
}

5.完整代码块  

/*****************************************/
//LQueue.h

typedef int QElemType;
//typedef struct BTNode* QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *_pNext;
}QNode;

typedef struct LQueue
{
QNode *pFront;
QNode *pRear;
}LQueue;


//初始化
void LQueueInit(LQueue *q);

//入队列
void LQueuePush(LQueue *q, QElemType data);

//出队列
void LQueuePop(LQueue *q);

//返回队头元素
QElemType LQueueTop(LQueue *q);

//返回返回队列长度
int LQueueSize(LQueue *q);

//队列是否为空
int LQueueEmpty(LQueue *q);


/************************************************/
//LQueue.c

#include <stdlib.h>
#include <assert.h>
#include <stdio.h>

//创建新结点
static QNode *BuyLQNode(QElemType data)
{
QNode *pLQNode = (QNode *)malloc(sizeof(QNode));
if (NULL == pLQNode)
{
printf("申请空间失败!\n");
assert(pLQNode);
}
pLQNode->data = data;
pLQNode->_pNext = NULL;

return pLQNode;
}

//初始化
void LQueueInit(LQueue *q)
{
assert(q);
q->pFront = q->pRear = NULL;
}

//入队列
void LQueuePush(LQueue *q, QElemType data)
{
assert(q);
if (NULL == q->pFront)
{
q->pFront = q->pRear = BuyLQNode(data);
return;
}
q->pRear->_pNext = BuyLQNode(data);
q->pRear = q->pRear->_pNext;
}

//出队列
void LQueuePop(LQueue *q)
{
assert(q);
QNode *pDel;
if (NULL == q->pFront)
{
return;
}

if (q->pFront == q->pRear)
{
q->pRear = NULL;
}

pDel = q->pFront;
q->pFront = q->pFront->_pNext;
free(pDel);
}

//返回队头元素
QElemType LQueueTop(LQueue *q)
{
assert(q);
return q->pFront->data;
}

//返回队尾元素
QElemType LQueueBack(LQueue *q)
{
assert(q);
return q->pRear->data;
}

//返回返回队列长度
int LQueueSize(LQueue *q)
{
int count = 0;
QNode *pCur;
assert(q);
pCur = q->pFront;
while (pCur)
{
pCur = pCur->_pNext;
count++;
}
return count;
}

//队列是否为空
int LQueueEmpty(LQueue *q)
{
return NULL == q->pFront;
}




C 4条回复 评论
爱潜水的Nick

学到了,原来是这样

发表于 2022-12-06 23:00:00
0 0
希望找回我家的猪

我的java个人心得,入门重要,但是大多 数人都搞错了方向: 第一.切记不要一上来就找一大本厚书看。 这样你绝对会放弃。《Java核心技术》 《Java编程思想》 等都不适合入门阅读,很容易半途而废。 第二.先找一个入门级别的java教程看。 网上有很多极简入门教程。 例如runoob网站、w3cschool网站(它还有手机app) (上网搜一下关键词就有了)。 我记得我一开始入门找的教程,知识面全而精炼简洁, 含有基础、spring、Hibernate Servlet 等,地址如下仅供参考。 How2J 的 Java教程 第三.当你学完刚才那些网站之后, 你应该此时对java有了一个整体的认识, 那就去找一个小项目,GitHub很棒, https://github.com/上手练习,边做项目边查资料。 进步会飞快。 第四.这个阶段再回头精读一些java经典书籍。 获得内功上的提升。总之,一定要循序渐进, 一点点学才是最正确的选择。个人愚见,仅供参考

发表于 2022-09-03 23:00:00
0 0
匀斋

文采四溢,大佬这是被耽搁的文学家啊!

发表于 2021-12-07 14:20:00
0 0
招招

起来更新了,老铁

发表于 2021-11-25 23:00:00
0 0