#include"pch.h"
#include<iostream>
using namespace std;
typedef int QElemType;//数据类型
typedef struct QNode {
QElemType data;
struct QNode *next;
}QNode, *QueuePtr; //结点类型
typedef struct {
QueuePtr front;//队头
QueuePtr rear;//队尾
}LinkQueue; //结点指针类型
//1.初始化
bool InitQueue(LinkQueue &Q) {
Q.front = Q.rear = new QNode;//指向新结点
Q.front->next = NULL;//头结点指针置空
return true;
}
//2.入队,不需判空
bool EnQueue(LinkQueue &Q, QElemType e) {
QNode * p = new QNode;
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return true;
}
//3.队头元素
QElemType GetHead(LinkQueue Q) {
if (Q.front != Q.rear) {//判空
return Q.front->next->data;
}
}
//4.出队
bool DeQueue(LinkQueue & Q,QElemType & e) {
if (Q.front == Q.rear) return false;//判空
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;
}
//5.遍历
void GetAll(LinkQueue Q){
if (Q.rear == Q.front) cout << "栈空,遍历失败" << endl;
QueuePtr p = Q.front->next;
int time = 0;
while (p) {
++time;
cout << p->data << " ";
p = p->next;
}
cout << "总共有" << time << "个元素" << endl;
}
//6.销毁
bool DestroyQueue(LinkQueue &Q) {
///销毁队列Q,Q不再存在
while (Q.front) {//从头结点开始减少
Q.rear = Q.front->next;//中间值
delete Q.front;
Q.front = Q.rear;
}
return true;
}
//7.清空
bool ClearQueue(LinkQueue &Q) {
///将Q清为空队列
QueuePtr q, p;
p = Q.front->next;
Q.front->next = NULL;//留下头结点,先断开与后面联系
while (p) {
q = p->next;
delete p;
p = q;
}
Q.rear = Q.front;
return true;
}
int main() {
LinkQueue S; QElemType e;
if (InitQueue(S))cout << "Succeed" << endl;
else cout << "Failed" << endl;
//入栈
cout << "input e:\t";
while (cin >> e) {//按"ctrl+z"结束输入
EnQueue(S, e);
cout << "input e:\t";
}
cout << "栈顶元素为" << GetHead(S) << endl;
cout << "栈所有元素为" << endl;
GetAll(S);
//出栈
if(DeQueue(S, e))
cout << "移除栈顶的元素是" << e<<endl;
else cout << "栈空" << endl;
cout << "栈剩下所有元素为" << endl;
GetAll(S);
ClearQueue(S);
cout << "清零后,栈剩下所有元素为" << endl;
GetAll(S);
DestroyQueue(S);
cout << "销毁后,栈剩下所有元素为" << endl;
GetAll(S);
}