链式栈

StackNode.h

template<typename Type>class LinkStack;

template<typename Type>class StackNode{
private:
	Type m_data;
	StackNode<Type> *m_pnext;
private:
	friend class LinkStack<Type>;
	StackNode(Type dt,StackNode<Type> *next):m_data(dt),m_pnext(next){};
};

LinkStack.h

#include "StackNode.h"

template<typename Type> class LinkStack{
private:
	StackNode<Type> *m_ptop;
public:
	LinkStack():m_ptop(NULL){}
	~LinkStack(){MakeEmpty();}
public:
	void MakeEmpty();
	void Push(const Type item);
	Type Pop();
	Type GetTop() const;
	void Print();
	bool IsEmpty() const{return m_ptop==NULL;}
};

LinkStack.cpp

template<typename Type> void LinkStack<Type>::MakeEmpty(){
	StackNode<Type> *p;
	while(m_ptop != NULL)
	{
		p = m_ptop;
		m_ptop = m_ptop->m_pnext;
		delete p;
	}
}
template<typename Type> void LinkStack<Type>::Push(const Type item){
	StackNode<Type> *p = new StackNode<Type>(item, m_ptop);
	m_ptop = p;
}
template<typename Type> Type LinkStack<Type>::GetTop() const{
	if(IsEmpty()){
		cout<<"There is no elements!"<<endl;
		exit(1);
	}
	return m_ptop->m_data;
}
template<typename Type> Type LinkStack<Type>::Pop(){
	if(IsEmpty()){
		cout<<"There is no elements!"<<endl;
		exit(1);
	}
	StackNode<Type> *p = m_ptop;
	m_ptop = m_ptop->m_pnext;
	Type temp = p->m_data;
	delete p;
	return temp;
}

template<typename Type> void LinkStack<Type>::Print(){
	StackNode<Type> *p = m_ptop;
	while(p != NULL)
	{
		cout<<p->m_data<<' ';
		p = p->m_pnext;
	}
	cout<<endl;
}

Test.cpp

#include <iostream>
using namespace std;
#include "LinkStack.h"

int main(){
	LinkStack<int> stack;
	int init[10]={1,3,5,7,4,2,8,0,6,9};
	for(int i=0;i<10;i++){
		stack.Push(init[i]);
	}
	stack.Print();

	cout<<stack.Pop()<<endl;
	stack.Print();
	
	cout<<stack.GetTop()<<endl;
	stack.Print();

	cout<<stack.Pop()<<endl;
	stack.Print();

	stack.MakeEmpty();
	stack.Print();
	
	stack.Pop();

	return 0;
}

你可能感兴趣的:(链式栈)