队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
代码如下:
typedef int QDataType;
struct QueueNode //队列结构,用链表来表示
{
struct QueueNode* next;
QDataType data;
};
代码如下:
struct Queue //队列头尾指针
{
struct QueueNode* head;
struct QueueNode* tail;
};
代码如下:
void QueueInit(struct Queue* pq)
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
}
遍历队列,记住free前先存储下一个节点的地址。
代码如下:
void QueueDestroy(struct Queue* pq)
{
assert(pq);
struct QueueNode* cur = pq->head;
while (cur)
{
struct QueueNode* next = cur->next;
free(cur);
cur = next;
}
pq->head = pq->tail = NULL;
}
先开辟一个结点,在分两种情况,一种情况队列一个节点都没有,那可以直接当节点,第二种情况队列一开始有节点,尾插数据即可。
代码如下:
void QueuePush(struct Queue* pq, QDataType x) //队尾入数据
{
assert(pq);
struct QueueNode* newnode = (struct QueueNode*)malloc(sizeof(struct QueueNode));
if (newnode == NULL)
{
printf("开辟失败!\n");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
if (pq->tail == NULL) //无节点
{
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
}
代码如下:
void QueuePop(struct Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
if (pq->head->next==NULL) //只有一个节点
{
free(pq->head);
pq->head = pq->tail = NULL;
}
else
{
struct QueueNode* next = pq->head->next;
free(pq->head);
pq->head = next;
}
}
记住每次取数据前判断队列是否为空,不为空才进行下一步。
代码如下:
QDataType QueueFront(struct Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->head->data;
}
记住每次取数据前判断队列是否为空,不为空才进行下一步。
代码如下:
QDataType QueueBack(struct Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->data;
}
代码如下:
bool QueueEmpty(struct Queue* pq)
{
assert(pq);
return pq->head == NULL;
}
代码如下:
int QueueSize(struct Queue* pq)
{
int size = 0;
assert(pq);
struct QueueNode* cur = pq->head;
while (cur)
{
size++;
cur = cur->next;
}
return size;
}
以上就是今天要讲的内容,本文仅仅简单介绍了队列的使用,对于队列提供了一些简便方法帮助我们解题,能使我们快速便捷地处理数据的函数和方法。另外这个结构虽然相比链表更简单,使用代码实现起来更容易写,但我们也要认真学习,以后会发现队列结构会带来很多优势,我们务必掌握。另外,如果有需要源码的私信我即可。还有,如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。
以前在做项目的时候碰到这样的需求。用户希望能够直接输入城市的名字,就能够得...
近来翻看很多朋友的BLOG,都发现很多好看的优酷视频不能全屏,或一点全屏又跳到...
目录 前言 系列文章直通车 一、编写生成通道交易配置文件命令 二、运行start.sh ...
SQLyog接虚拟机Linux系统下MySQL数据库失败 报错信息Can’t connect to MYSQL se...
轻巧而直接,nano 提供了一个简单、直观的编辑器,没有额外的麻烦。 许多 Linux ...
1.Http连接基础 Http协议承载了互联网上的主要流量,然而说到传输,还要回归到最...
前言 在我们使用 laravel 框架的验证器,有的时候需要对表单等进行数据验证,当...
Jsp是sun在servlet基础上发展而来的一种新的web开发工具,在国外Ejb+jsp/servlet...
时间戳格式: //获取今日开始时间戳和结束时间戳 $beginToday=mktime(0,0,0,date...
展开运算符(spread operator)允许一个表达式在某处展开。展开运算符在多个参数...