#include<iostream>
#define OVERFLOW 1
#define ERROR 1
using namespace std;
//队列中的元素之间仍然有着链表的特点
typedef struct QNode {
int data;
struct QNode* next;
}QNode,*QueuePtr;
//声明队列结构体 队尾指针和队头指针
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//初始化
void InitQue(LinkQueue& Q) {
Q.front = Q.rear = new QNode;
if (!Q.front)
exit(OVERFLOW);
Q.front->next = NULL;
}
//判空
bool QueEmpty(LinkQueue Q) {
return(Q.rear == Q.front);
}
//入队
void EnQue(LinkQueue& Q) {
int e;
cout << "输入入队元素数据:\n";
cin >> e;
QueuePtr p = new QNode;
p->data = e;
Q.rear->next = p;
Q.rear = p;
p->next = NULL;
}
void DeQue(LinkQueue& Q) {
//出队相当于删除一个节点
if (QueEmpty(Q))
return;
int e;
QueuePtr p = Q.front->next;
e = p->data;
Q.front->next = p->next;
delete p;
}
int GetHead(LinkQueue Q) {
if (QueEmpty(Q))
return ERROR;
else
return (Q.front->next->data);
}
int QueueLength(LinkQueue Q) {
if (QueEmpty(Q))
return 0;
int i = 0;
QueuePtr p = Q.front->next;
while (p) {
i++;
p = p->next;
}
return i;
}
void Traverse(LinkQueue Q) {
QueuePtr p = Q.front->next;
while (p) {
cout << p->data;
cout << " ";
p = p->next;
}
cout << "\n";
}
void ClearQue(LinkQueue& Q) {
QueuePtr p = Q.front->next;
QueuePtr q;
while (p) {
q = p->next;
delete p;
p = q;
}
Q.front->next = NULL;
}
void DestroyQue(LinkQueue& Q) {
while (Q.front) {
QueuePtr p = Q.front->next;
delete Q.front;
Q.front = p;
}
}
int main() {
LinkQueue Q;
InitQue(Q);
for (int i = 0; i < 5; i++) {
EnQue(Q);
}
Traverse(Q);
DeQue(Q);
Traverse(Q);
DeQue(Q);
Traverse(Q);
EnQue(Q);
EnQue(Q);
cout << "队头元素为:";
cout << GetHead(Q);
cout << "\n";
cout << "队列元素个数:";
cout << QueueLength(Q);
ClearQue(Q);
cout << "\n";
Traverse(Q);
DestroyQue(Q);
}
链队列本质上和链表一样 只不过多了两个指针 分别指向队头和队尾
队列和栈不相同 栈是先进后出 进出口相同 队列是先进先出 进出口不同