栈(链式存储) C++模板实现

#include <iostream>
using namespace std;

//栈结点类
template <typename T>
class stackNode{
	private:
		T data; //结点数据部分
		stackNode<T> *next; //指向下一个结点
	public:
		//构造函数,初始化成员变量
		stackNode(T d = 0 , stackNode<T> * n=NULL){
			data = d;
			next = n;
		}
		//设置成员变量data
		void setData(T d){
			data = d;
		}
		//设置成员变量next
		void setNext(stackNode<T> * n){
			next = n;
		}
		//返回成员变量data
		T getData() const{
			return data;
		}
		//返回成员变量next
		stackNode<T> *getNext() const{
			return next;
		}
};

//栈类
template <typename T>
class stackList{
	private:
		stackNode<T> *top;  //指向栈顶结点,也是链表的头指针
		int num;  //栈结点个数
	public:
		//构造函数
		stackList(){ 
			top=NULL; 
			num=0;
		}
		//析构函数,释放栈中所有结点,其实也就是释放整个链表
		~stackList(){		
			while(top){
				stackNode<T> * p = top;
				top = top->getNext();
				delete p;
			}
		}
		//将结点x压入栈
		void push(stackNode<T> & x);
		//弹出栈顶结点
		void pop();
		//获得栈顶结点
		stackNode<T> & getPeek()const;
		//栈是否为空
		bool isEmpty() const;
		//返回栈中元素个数
		int getNum() const{
			return num;
		}
		//打印栈中元素
		void printAll()const;
};


//将结点x压入栈,实现部分
template <typename T>
void stackList<T>::push(stackNode<T> & x){
	stackNode<T> *p = top;
	top = &x;
	x.setNext(p);
	num++;
}

//弹出栈顶结点,实现部分
template <typename T>
void stackList<T>::pop(){
	if(isEmpty()){
		cerr<<"栈为空,弹出失败"<<endl;
		exit(1);
	}
	stackNode<T> *p = top;
	top=top->getNext();
	delete p;
	num--;
}

//获得栈顶结点,实现部分
template <typename T>
stackNode<T> & stackList<T>::getPeek() const{
	if(isEmpty()){
		cerr<<"栈为空"<<endl;
		exit(1);
	}
	return *top;
}

//栈是否为空,实现部分
template <typename T>
bool stackList<T>::isEmpty() const{
	return top==NULL;
}

//打印栈中元素,实现部分
template <typename T>
void stackList<T>::printAll() const{
	stackNode<T> *p = top;
	while(p){
		cout<<p->getData()<<endl;
		p=p->getNext();
	}
}

void main(){
	stackNode<int> *p1 = new stackNode<int>(1); //创建第一个结点,值为1
	stackNode<int> *p2 = new stackNode<int>(2); //创建第一个结点,值为2
	stackNode<int> *p3 = new stackNode<int>(3); //创建第一个结点,值为3
	stackNode<int> *p4 = new stackNode<int>(4); //创建第一个结点,值为4
	stackNode<int> *p5 = new stackNode<int>(5); //创建第一个结点,值为5
	stackList<int> a;  //创建栈
	a.push(*p1); //压入第一个结点
	a.push(*p2); //压入第二个结点
	a.push(*p3); //压入第三个结点
	a.push(*p4); //压入第四个结点
	a.push(*p5); //压入第五个结点
	a.pop(); //弹出栈顶元素
	a.printAll(); //打印栈中元素
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值