赞
踩
目录
队列:
队列也是操作受限的线性表 限定在只能在表的一端进行插入 在表的另一端进行删除
栈是先进后出 队列是先进先出
允许插入数据的位置叫队尾 插入数据叫入队
允许删除数据的位置叫队头 删除数据叫出队
队列的物理实现 顺序队列(数组实现) 链式队列(链表实现)
我们只讨论链式队列 顺序队列除了考试没什么人用的
以下8个队列函数就全部结束了 现在就有了队列的基础功能了
1 队列的数据结构 需要两个结构体
- struct lnode
- {
- elemtype data;//存储队列中的元素
- struct lnode* next;//next指针
- };
- struct linkqueue
- {
- lnode* head, * tail;//队列的头指针和尾指针
- };
2 初始化队列函数
- bool initqueue(linkqueue& qq)//结构体别名
- {
- qq.head = new(std::nothrow)lnode;//分配头节点
- if (qq.head == nullptr) return false;//内存不足 返回失败
- qq.head->next = nullptr;//头结点的下一结点暂时不存在 置空
- qq.tail = qq.head; //尾指针目前指向头结点
- return true;
- }
3 销毁队列函数
- void destroyqueue(linkqueue& qq)
- {
- lnode* tmp;
- while (qq.head != nullptr)
- {
- tmp = qq.head->next; //tmp先保存下一结点的地址
- delete qq.head; //释放当前节点
- qq.head = tmp; //头指针移动到下一节点
- }
- }
队列的入队和出队具体实现(图形方式)
1:队列的入队规则 大白话来说就是从尾部next指针进行添加节点
2: 队列的出队规则 大白话来说就是从头部next指针进行删除结点
了解了入队和出队的实现方式 就能理解入队出队代码了
4 元素入队函数
- bool inqueue(linkqueue& qq,const elemtype ee)
- {
- if (qq.head == nullptr) { cout << "队列未初始化。\n"; return false; }
- lnode* tmp = new(std::nothrow)lnode;//分配新节点
- if (tmp == nullptr) return false;
-
- tmp->data = ee; //把元素的值存入data中
- tmp->next = nullptr; //tmp因为是最后一个元素所以next是nullptr
- qq.tail->next = tmp; //把tmp追加到qq.tail后
- qq.tail = tmp; // 重新设置tail指针。
- return true;
- }
5 元素出队函数
- bool OutQueue(linkqueue& QQ, elemtype& ee)
- {
- if (QQ.head == nullptr) { cout << "队列未初始化。\n"; return false; }
- if (QQ.head->next == nullptr) { cout << "队列为空。\n"; return false; }
- lnode* tmp = QQ.head->next; // tmp指向第一个结点。
- ee = tmp->data; // 把第一个结点的数据保存到ee中。
- QQ.head->next = tmp->next; // 头结点的next指针指向第二个结点。
- // 如果出队的是最后一个结点。
- if (tmp == QQ.tail) QQ.tail = QQ.head;
- delete tmp; // 释放已出队的结点。
- return true;
- }
6 显示队列中全部的元素函数。
- void printqueue(linkqueue& qq)
- {
- if (qq.head == nullptr) { cout << "队列未初始化。\n"; return; }
- lnode* tmp = qq.head->next;
- while (tmp != nullptr)
- {
- cout << tmp->data<<" ";
- tmp = tmp->next;
- }
- cout << endl;
- }
7 求队列长度函数
- int Length(linkqueue& qq)
- {
- if (qq.head == nullptr) { cout << "队列未初始化。\n"; return false; }
- lnode* tmp = qq.head->next;
- int length = 0;
- while (tmp != nullptr)
- {
- length++;
- tmp = tmp->next;
- }
- return length;
-
- }
8 清空队列函数
- void clear(linkqueue& qq)
- {
- if (qq.head == nullptr) { cout << "队列未初始化。\n"; return; }
- // 清空队列是指释放链表全部的数据结点,但保留头结点。
- lnode* tmp = qq.head->next;
- lnode* tmpnext;
- while (tmp != nullptr)
- {
- tmpnext = tmp->next; // tmpnext保存下一结点的地址。
- delete[]tmp; // 释放当前结点。
- tmp = tmpnext; // tmp指针移动到下一结点。
- }
- qq.head->next = nullptr;
- qq.tail = qq.head; // 尾指针指向头结点。
- }
main 函数内容
- int main()
- {
- linkqueue qq; //创建队列
- memset(&qq, 0, sizeof(qq));
- initqueue(qq);//初始化队列
-
- //入队使用for循环
- cout << "使用for循环入队0-9" << endl;
- for (int i = 0; i < 10; i++)
- {
- inqueue(qq, i);
- }
- cout << "队列中的元素是:";
- printqueue(qq);
- cout << "队列的长度是:" << Length(qq) << "。\n";
- elemtype ee; // 创建一个数据元素变量ee 用于接收出队的数据。
-
- //出队一个元素
- cout << "首先将首元素出队" << endl;
- OutQueue(qq, ee);
- cout << "出队的元素值为" << ee << endl;
- cout << "队列中的元素是:";
- printqueue(qq);
- //全部出队
- cout << "使用while 将剩余元素全部出队" << endl;
- while (OutQueue(qq, ee))
- cout << "出队的元素值为" << ee << endl;
- cout << "队列中的元素是:";
- printqueue(qq);
-
-
- destroyqueue(qq); // 销毁队列QQ。
- }
运行后截图
- #include <iostream>
- using namespace std;
- typedef int elemtype; // 自定义队列的数据元素为整数。
- //队列的数据结构 两个结构体
- struct lnode
- {
- elemtype data;//存储队列中的元素
- struct lnode* next;//next指针
- };
- struct linkqueue
- {
- lnode* head, * tail;//队列的头指针和尾指针
- };
- // 初始化队列。
- bool initqueue(linkqueue& qq)//结构体别名
- {
- qq.head = new(std::nothrow)lnode;//分配头节点
- if (qq.head == nullptr) return false;//内存不足 返回失败
- qq.head->next = nullptr;//头结点的下一结点暂时不存在 置空
- qq.tail = qq.head; //尾指针目前指向头结点
- return true;
- }
- // 销毁队列QQ。
- void destroyqueue(linkqueue& qq)
- {
- lnode* tmp;
- while (qq.head != nullptr)
- {
- tmp = qq.head->next; //tmp先保存下一结点的地址
- delete qq.head; //释放当前节点
- qq.head = tmp; //头指针移动到下一节点
- }
- }
- // 元素入队。
- bool inqueue(linkqueue& qq,const elemtype ee)
- {
- if (qq.head == nullptr) { cout << "队列未初始化。\n"; return false; }
- lnode* tmp = new(std::nothrow)lnode;//分配新节点
- if (tmp == nullptr) return false;
-
- tmp->data = ee; //把元素的值存入data中
- tmp->next = nullptr; //tmp因为是最后一个元素所以next是nullptr
- qq.tail->next = tmp; //把tmp追加到qq.tail后
- qq.tail = tmp; // 重新设置tail指针。
- return true;
- }
- // 元素出队。
- // // 元素出队。
- bool OutQueue(linkqueue& QQ, elemtype& ee)
- {
- if (QQ.head == nullptr) { cout << "队列未初始化。\n"; return false; }
- if (QQ.head->next == nullptr) { return false; }
- lnode* tmp = QQ.head->next; // tmp指向第一个结点。
- ee = tmp->data; // 把第一个结点的数据保存到ee中。
- QQ.head->next = tmp->next; // 头结点的next指针指向第二个结点。
- // 如果出队的是最后一个结点。
- if (tmp == QQ.tail) QQ.tail = QQ.head;
- delete tmp; // 释放已出队的结点。
- return true;
- }
- // 显示队列中全部的元素。
- void printqueue(linkqueue& qq)
- {
- if (qq.head == nullptr) { cout << "队列未初始化。\n"; return; }
- lnode* tmp = qq.head->next;
- while (tmp != nullptr)
- {
- cout << tmp->data<<" ";
- tmp = tmp->next;
- }
- cout << endl;
- }
-
- // 求队列的长度。
- int Length(linkqueue& qq)
- {
- if (qq.head == nullptr) { cout << "队列未初始化。\n"; return false; }
- lnode* tmp = qq.head->next;
- int length = 0;
- while (tmp != nullptr)
- {
- length++;
- tmp = tmp->next;
- }
- return length;
-
- }
- // 清空队列。
- void clear(linkqueue& qq)
- {
- if (qq.head == nullptr) { cout << "队列未初始化。\n"; return; }
- // 清空队列是指释放链表全部的数据结点,但保留头结点。
- lnode* tmp = qq.head->next;
- lnode* tmpnext;
- while (tmp != nullptr)
- {
- tmpnext = tmp->next; // tmpnext保存下一结点的地址。
- delete[]tmp; // 释放当前结点。
- tmp = tmpnext; // tmp指针移动到下一结点。
- }
- qq.head->next = nullptr;
- qq.tail = qq.head; // 尾指针指向头结点。
- }
- int main()
- {
- linkqueue qq; //创建队列
- memset(&qq, 0, sizeof(qq));
- initqueue(qq);//初始化队列
-
- //入队使用for循环
- cout << "使用for循环入队0-9" << endl;
- for (int i = 0; i < 10; i++)
- {
- inqueue(qq, i);
- }
- cout << "队列中的元素是:";
- printqueue(qq);
- cout << "队列的长度是:" << Length(qq) << "。\n";
- elemtype ee; // 创建一个数据元素变量ee 用于接收出队的数据。
-
- //出队一个元素
- cout << "首先将首元素出队" << endl;
- OutQueue(qq, ee);
- cout << "出队的元素值为" << ee << endl;
- cout << "队列中的元素是:";
- printqueue(qq);
- //全部出队
- cout << "使用while 将剩余元素全部出队" << endl;
- while (OutQueue(qq, ee))
- cout << "出队的元素值为" << ee << endl;
- cout << "队列中的元素是:";
- printqueue(qq);
-
-
- destroyqueue(qq); // 销毁队列QQ。
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。