续:
上一节: 队列--数组实现
上一节:队列–数组实现
创建队列并初始化
入队与出队
清空队列以及队列元素获取
1.创建并初始化
#include <iostream>
#include <iomanip>
#include <Windows.h>
#define MaxSize 5
using namespace std;
typedef int DataType;
typedef struct _Qnode {
DataType data;
struct _Qnode* next;
}QNode;
typedef QNode* QueuePtr;
typedef struct Queue {
int length;
QueuePtr fron;
QueuePtr rear;
}LinkQueue;
bool InitQueue(LinkQueue*LQ){
if (!LQ) return false;
LQ->length = 0;
LQ->fron = LQ->rear = NULL;
return true;
}
2.0入队原理:
判断队列是否为满, 在创建一个新节点,节点的数据要等于写入的数据,
再把next置为NULL,之后就有两种情况一种是空队列,一种是有元素的队列,
空队列就需要把头指针与尾指针指向新创建的节点,
有元素的队列就需要在对尾插入节点qNode,然后尾部节点在指向新的节点,
再把元素队列元素++就ok了
入队实现:
bool FullQueue(LinkQueue* LQ) {
if (!LQ) return false;
if (LQ->length == MaxSize) return true;
return false;
}
bool EmptyQueue(LinkQueue* LQ) {
if (!LQ) return false;
if (LQ->fron == NULL) return true;
return false;
}
bool EnterQueue(LinkQueue* LQ, DataType data) {
if (!LQ) return false;
if (FullQueue(LQ)) {
cout << "无法插入元素:" << data << " 队列已满!" << endl;
return false;
}
QNode* qNode = new QNode;
qNode->data = data;
qNode->next = NULL;
if (EmptyQueue(LQ)) {
LQ->fron = LQ->rear = qNode;
} else {
LQ->rear->next = qNode;
LQ->rear = qNode;
}
LQ->length++;
return true;
}
2.1出队原理:
创建一个临时节点,判断队列是否为空,吧要删除的节点指向临时节点,
头节点指向下一个节点,在判断下一个节点是否存在,
若不存在要将尾节点置空,再把元素队列--,之后释放临时节点。
bool DeleteQueue(LinkQueue* LQ, DataType* data) {
QNode* tmp = NULL;
if (!LQ || EmptyQueue(LQ)) {
cout << "队列为空" << endl;
return false;
}
if (!data) return false;
tmp = LQ->fron;
LQ->fron = tmp->next;
if (!LQ->fron) LQ->rear = NULL;
*data = tmp->data;
LQ->length--;
delete tmp;
return true;
}
3.0清空队列原理:
临时节点保存头节点的下一个节点,然后删除节点,
在指向下一个节点,一直删除,删除之后,
再将前节点与尾节点置为NULL
bool ClearQueue(LinkQueue* LQ) {
if (!LQ) return false;
while (LQ->fron) {
QueuePtr tmp = LQ->fron->next;
delete LQ->fron;
LQ->fron = tmp;
}
LQ->fron = LQ->rear = 0;
LQ->length = 0;
return true;
}
3.1队列元素获取:
直接返回LQ->length
bool GetLength(LinkQueue* LQ) {
if (!LQ) return false;
return LQ->length;
}
元素输出:
void Print(LinkQueue* LQ) {
QueuePtr tmp;
if (!LQ) return;
tmp = LQ->fron;
while (tmp) {
cout << setw(4) << tmp->data;
tmp = tmp->next;
}
cout << endl;
}
main:
int main(void) {
LinkQueue* LQ = new LinkQueue;
DataType data = -1;
InitQueue(LQ);
for(int i=0; i<7; i++){
EnterQueue(LQ, i);
}
cout << "队列中的元素<总共" << GetLength(LQ) << "个>" << endl;
Print(LQ);
cout << endl;
for (int i = 0; i < 7; i++) {
if (DeleteQueue(LQ, &data)) {
cout << "出队的元素是:" << data << endl;
}
else {
cout << "出队失败!" << endl;
}
}
cout << "队列剩下元素:" << GetLength(LQ) << "个" << endl;
Print(LQ);
cout << endl;
if (ClearQueue(LQ)) {
cout << "清空队列成功!" << endl;
}
else {
cout << "清空队列失败" << endl;
}
Print(LQ);
delete LQ;
system("pause");
return 0;
}