C++模板实现栈

尽管C++的STL库里面有Stack类,但是本着学习的目的,在参考他人成果的基础上,我决定自己实现一次。这个实现采用的是”链表+动态内存+模板”的方式实现。众所周知,栈是一种后进先出的数据结构,即先入栈的元素最后出栈,最后入栈的元素最先出栈。栈常常使用在计算机的变量存储中。
首先定义元素节点的数据结构:

template<typename T>
struct stackNode
{
	T data;//存储的具体元素
	stackNode* next;//指向下一个节点的指针
};

然后需要定义一个MyStack类:

template<typename T>
class MyStack
{
private:
	unsigned int count;//计数目前stack中存储的元素个数
	unsigned int maxSize;//stack中最大存储的元素个数
	stackNode<T>* top;//stack头节点的指针
public:
	MyStack();//默认构造函数,创建最多容纳10个元素的stack
	MyStack(unsigned int ms);//自定义容纳个数
	~MyStack();//析构函数
	int push(T data);//压栈
	int pop(void);//出栈
	T getTop(void);//获取栈顶元素
	bool isempty(void);//检查是否为空
	bool isfull(void);//经检查是否已满
};

代码实现,注意:由于使用模板类,类中成员函数的实现需要在同一个.h文件连实现,不可以另外在同名的.cpp中实现;具体原因请见:https://blog.youkuaiyun.com/jinzeyu_cn/article/details/45795923,该博主研究比较深入。

template<typename T>
MyStack<T>::MyStack()
{
	count = 0;
	maxSize = 10;
	top = NULL;
}
template<typename T>
MyStack<T>::MyStack(unsigned int ms)
{
	count = 0;
	maxSize = ms;
	top = NULL;
}
template<typename T>
MyStack<T>::~MyStack()
{
	stackNode<T>* p = new stackNode<T>;
	for (unsigned int i = count; i >0; i--)
	{
		p = top;
		top = p->next;
		delete p;
	}
}
template<typename T>
int MyStack<T>::push(T data)
{
	count++;
	if (isfull())
	{
		cout << "Error: This Stack is full" << endl;
		cout << "File Path =" << __FILE__ << endl;
		cout << "Function Name =" << __FUNCTION__ << endl;
		cout << "Line =" << __LINE__ << endl;
		return 1;
	}
	stackNode<T>* node = new stackNode<T>;
	node->data = data;
	node->next = top;
	top = node;
	return 0;
}
template<typename T>
int MyStack<T>::pop(void)
{
	if (isempty())
	{
		cout << "Error: Stack is empty" << endl;
		cout << "File Path =" << __FILE__ << endl;
		cout << "Function Name =" << __FUNCTION__ << endl;
		cout << "Line =" << __LINE__ << endl;
		return 1;
	}
	stackNode<T>* p = top;
	top = top->next;
	delete p;
	count--;
	return 0;
}
template<typename T>
T MyStack<T>::getTop(void)
{
	return top->data;
}
template<typename T>
bool MyStack<T>::isempty(void)
{
	return count == 0 ? true : false;
}
template<typename T>
bool MyStack<T>::isfull(void)
{
	return count > maxSize ? true : false;
}

代码不多,测试一下吧

#include<iostream>
#include"myStack.h"

using namespace std;
struct customer
{
	char fullname[40];
	double payment;
};
int main()
{
	MyStack<customer> cus;
	customer c[] = { { "Tom", 1000 }, { "Jane", 200.9 }, { "John", 399.22 }, {"Mark",88.99} };
	customer temp;
	for (int i = 0; i < 4; i++)
	{
		cus.push(c[i]);
	}
	double total_payment=0;
	for (int i = 0; i < 4; i++)
	{
		temp = cus.getTop();
		cout << "Name" << temp.fullname << endl;
		cout << "payment=" << temp.payment << endl;
		total_payment += temp.payment;
		cout << "total payment=" << total_payment << endl;
		cus.pop();
		cout << endl;
	}
	
	system("pause");
	return 0;
}

运行良好。。。。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值