经典数据结构之链表实现的栈

数组和链表是线性表的两种表现方式,而栈作为一种适配器,既可以用数组实现,也可以用链表实现,由于采用后进先出的方式,两者添加和删除元素都是O(1)的。主要区别之处是数组本身使用的空间较小,因为只需要用n个元素外加长度属性就好了。链表使用的空间较大,这是因为节点本身需要一个指针和数据来表示。

#include <stdio.h>
#include <assert.h>

template<typename T>
struct CLinkStack;

template<typename T>
struct SNode{
	friend CLinkStack<T>;
public:
	SNode();
	SNode(const T& data);
private:
	// members;
	T m_nData;
	SNode<T>* m_pNext;
};

template<typename T>
SNode<T>::SNode():
	m_pNext(NULL){}

template<typename T>
SNode<T>::SNode(const T& data):
	m_nData(data), m_pNext(NULL) {}
	
template<typename T>
class CLinkStack{
private:	
    SNode<T>* m_pTop;

public:
	// constructors;
    CLinkStack();
	~CLinkStack();
    // methods;
	T mTop() const;

    CLinkStack<T>& mAdd(const T& data);
	CLinkStack<T>& mDelete();
    
	bool mIsEmpty() const;
};

template<typename T>
CLinkStack<T>::CLinkStack(){
	m_pTop = NULL;
}

template<typename T>
CLinkStack<T>::~CLinkStack(){
	while(m_pTop != NULL){
       SNode<T>* pTmp = m_pTop;
	   m_pTop = m_pTop -> m_pNext;
	   delete pTmp;
	}
}

template<typename T>
CLinkStack<T>& CLinkStack<T>::mAdd(const T& data){
    SNode<T>* pTmp = new SNode<T>(data);
	pTmp -> m_pNext = m_pTop;
	m_pTop = pTmp;
	return *this;
}

template<typename T>
CLinkStack<T>& CLinkStack<T>::mDelete(){
	if(m_pTop != NULL){
	    SNode<T>* pTmp = m_pTop;
		m_pTop = m_pTop -> m_pNext;
		delete [] pTmp;
	}
    return *this;
}

template<typename T>
bool CLinkStack<T>::mIsEmpty() const{
    return ((m_pTop == NULL) ? true : false);
}

template<typename T>
T CLinkStack<T>::mTop() const{
	assert(m_pTop != NULL);
	return m_pTop->m_nData;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值