目录
链队的存储方式
可以通过 单链表 的方式来实现,使用链式队的优点在于它能够克服用数组实现的顺序队空间利用率不高的特点,但是需要为每个队元素分配额外的指针空间用来存放指针域。如下就是一个链式队:
链队的优点
链队的优点在于如果没有办法估计队列长度时,采用链队可以随时扩充。
链队功能函数
bool InitQueue(LinkQueue &Q); //1.队列的初始化
bool EnQueue(LinkQueue &Q,ElemType e); //2.入队
bool DeQueue(LinkQueue &Q, ElemType &e); //3.出队
bool GetHead(LinkQueue Q,ElemType &e); //4.得到队头元素
bool DestroyQueue(LinkQueue &Q) //5.销毁队列
代码实现
#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 100
typedef int ElemType;
typedef struct Qnode {
ElemType data;
struct Qnode *next;
}QNode, *QuenePtr;
typedef struct {
QuenePtr front; //队头指针
QuenePtr rear; //队尾指针
}LinkQueue;
//初始化队列
bool InitQueue(LinkQueue &Q) {
Q.front = Q.rear = new QNode;
if(!Q.front)
exit(-1);
Q.front->next = NULL;
return true;
}
//销毁链队列
bool DestroyQueue(LinkQueue &Q) {
QuenePtr p = new QNode;
while(Q.front) {
p = Q.front->next;
delete Q.front;
Q.front = p;
}
return true;
}
//入队
bool EnQueue(LinkQueue &Q,ElemType e) {
QuenePtr p = new QNode;
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return true;
}
//出队
bool DeQueue(LinkQueue &Q, ElemType &e) {
if(Q.rear == Q.front)
return false;
QuenePtr p = new QNode;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p)
Q.rear = Q.front;
delete p;
return true;
}
//求链队列队头元素
bool GetHead(LinkQueue Q,ElemType &e) {
if(Q.rear == Q.front)
return false;
e = Q.front->next->data;
return true;
}
int main() {
int n;
ElemType e;
LinkQueue que;
InitQueue(que);
cout << "队列已经初始化" << endl;
cout << "请输入队列中元素个数:" << endl;
cin >> n;
cout << "请依次输入队列中元素:" << endl;
for(int i = 0; i < n; i++) {
cin >> e;
EnQueue(que, e);
}
cout << "取出队列中所有元素:";
while(true) {
if(DeQueue(que, e))
cout << e << " ";
else
break;
}
cout << endl;
cout << "在队列中加入一个元素:" << endl;
cin >> e;
EnQueue(que, e);
cout << "此时队头元素为:" << e << endl;
GetHead(que, e);
DestroyQueue(que);
return 0;
}