C++手动封装栈和队列——数据结构

话不多说,直接上代码

顺序栈
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int Maxsize = 100;
template <typename T>
struct Stack
{
	T data[Maxsize];
	int top;
};
template <typename T>
void InitStack(Stack<T> *&s) {//初始化栈
	s = new Stack<T>;
	s->top = -1;
}
template <typename T>
void DestroyStack(Stack<T>*& s) {//销毁栈
	delete s;
}
template <typename T>
bool StackEmpty(Stack<T>*& s) {//判断栈是否为空
	return (s->top == -1);
}
template <typename T>
void Push(Stack<T>*& s,T e) {//入栈
	if (s->top == Maxsize - 1)  cout << "栈已满,入栈失败" << endl;
	else {
		s->top++;
		s->data[s->top] = e;
	}
}
template <typename T>
void Pop(Stack<T>*& s) {//出栈
	if (s->top == -1)  cout << "栈已空,出栈失败" << endl;
	else s->top--;
}
template <typename T>
T Top(Stack<T>*& s) {//取栈顶
	if (s->top == -1) {
		cout << "栈已空,取栈顶失败" << endl; return 0;
	}
	else return s->data[s->top];
}
int main() {
	Stack<int>* s;
	InitStack(s);
	for (int i = 1; i <= 5; i++) {
		Push(s, i);
	}
	while (!StackEmpty(s))
	{
		cout << Top(s) << " ";
		Pop(s);
	}
	Stack<char>* c;
	InitStack(c);
	for (char i = 'a'; i <= 'e';i++) {
		Push(c, i);
	}
	while (!StackEmpty(c))
	{
		cout << Top(c) << " ";
		Pop(c);
	}
	return 0;
}
链栈
#include<iostream>
#include<stack>
using namespace std;
template<typename T>
struct Stack
{
	T data;
	Stack* next;
};

template<typename T>
void InitStack(Stack<T>*& s)  //初始化空栈
{
	s = NULL;//不设头结点
}

template<typename T>
void DestroyStack(Stack<T>*& s) {//销毁栈
	Stack<T>* p = s;
	while (p)
	{
		s = p->next;
		delete p;
		p = s;
	}
	delete p;
}

template<typename T>
bool StackEmpty(Stack<T>*& s) {//判断栈是否为空
	return (s == NULL);
}

template<typename T>
void Push(Stack<T>*& s, T x) {//入栈
	Stack<T>* p;
	p = new Stack<T>;
	p->data = x;
	p->next = s;
	s = p;
}

template<typename T>
void Pop(Stack<T>*& s) {//出栈
	if (s == NULL) cout << "栈已空,出栈失败" << endl;
	else {
		Stack<T>* p = s;
		s = s->next;
		delete p;
	}
}

template<typename T>
T Top(Stack<T>*& s) {//取栈顶
	if (s) return s->data;
	else cout<< "栈已空,取栈顶失败" << endl;
}

int main() {
	Stack<int>* s;
	InitStack(s);
	for (int i = 1; i <= 5; i++) {
		Push(s, i);
	}
	while (!StackEmpty(s))
	{
		cout << Top(s) << " ";
		Pop(s);
	}
	Stack<char>* c;
	InitStack(c);
	for (char i = 'a'; i <= 'e'; i++) {
		Push(c, i);
	}
	while (!StackEmpty(c))
	{
		cout << Top(c) << " ";
		Pop(c);
	}
	return 0;
}
顺序队
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int Maxsize = 100;
template<typename T>
struct Queue
{
	T data[Maxsize];
	int front, rear;
};
template<typename T>
void InitQueue(Queue<T>*& q) {
	q = new Queue<T>;
	q->front = q->rear = -1;
}

template<typename T>
void DestroyStack(Queue<T>*& q) {//销毁栈
	delete q;
}

template<typename T>
bool StackEmpty(Queue<T>*& q) {//判断栈是否为空
	return (q->front == q->rear);
}

template<typename T>
void Push(Queue<T>*& q, T e) {//入队
	if (q->rear == Maxsize - 1) cout << "队已满,入队失败" << endl;
	else {
		q->rear++;
		q->data[q->rear] = e;
	}
}

template<typename T>
bool Pop(Queue<T>*& q,T &e) {//出队
	if (q->rear == q->front) return 0;
	else {
		q->front++;
		e = q->data[q->front];
		return 1;
	}
}

int main() {
	Queue<int>* q; int e;
	InitQueue(q);
	for (int i = 1; i <= 5; i++) {
		Push(q, i);
	}
	while(Pop(q,e)){
		cout << e << " ";
	}
	return 0;
}
链队
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
template<typename T>
struct qnode
{
	T data;
	qnode* next;
};
template<typename T>
struct Queue
{
	qnode<T>* front, * rear;//队头指针  队尾指针
};
template<typename T>
void InitQueue(Queue<T>*& q) {//初始化队
	q = new Queue<T>;
	q->front = q->rear = NULL;
}

template<typename T>
void DestroyStack(Queue<T>*& q) {//销毁队
	qnode<T>* p = q->front, * r;
	if (p) {
		r = p->next;
		while (r) {
			delete p;
			p = r;
			r = p->next;
		}
	}
	delete p;
	delete q;
}

template<typename T>
bool StackEmpty(Queue<T>*& q) {//判断队是否为空
	return (q->rear == NULL);
}

template<typename T>
void Push(Queue<T>*& q, T e) {//入队
	qnode<T>* p = new qnode<T>;
	p->data = e;
	p->next = NULL;
	if (q->rear == NULL) q->front = q->rear = p;
	else {
		q->rear->next = p;
		q->rear = p;
	}
}

template<typename T>
bool Pop(Queue<T>*& q,T &e) {//出队
	if (q->rear == NULL) return 0;
	else {
		e = q->front->data;
		if (q->front == q->rear) q->front = q->rear = NULL;
		else q->front = q->front->next;
		return 1;
	}
}

int main() {
	Queue<int>* q; int e;
	InitQueue(q);
	for (int i = 1; i <= 5; i++) {
		Push(q, i);
	}
	while (Pop(q,e))
	{
		cout << e << " ";
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/buibuilili/article/details/107774107