栈和队列6--链栈

#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);
}
发布了122 篇原创文章 · 获赞 14 · 访问量 6184

猜你喜欢

转载自blog.csdn.net/weixin_44001521/article/details/103746396