数据结构之线性结构---栈 链式储存

本文介绍了栈的链式储存方式及其特点,包括比顺序存储结构存储密度小、逻辑上相邻节点物理上不必相邻等优势,并详细展示了栈的链式储存实现过程,包括节点类和栈类的设计及核心方法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、链式储存的特点:

栈的链式储存是通过链表的方式进行储存,链式储存的优点在于
1、比顺序存储结构的存储密度小 每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多。

2、逻辑上相邻的节点物理上不必相邻。

3、插入、删除灵活 不必移动节点,只要改变节点中的指针。

二、栈的链式储存实现

AL_Node.h

#ifndef AL_NODE_INCLUDE
#define AL_NODE_INCLUDE

#include <windows.h>
template<typename T> class AL_StackList;

template<typename T>
class AL_Node
{
    //声明一个朋友类,使这个朋友类可以访问这个类的私有元素
    friend class AL_StackList<T>;
public:
    ~AL_Node();
private:
    AL_Node();
    AL_Node(const T &tTemplate);
    AL_Node(const AL_Node<T>& cAL_Node);
    T m_data;//存储数据
    AL_Node *m_pPre;//记录链表的头结点地址
    AL_Node *m_pNext; //指向下一个节点地址
};

template<typename T>
AL_Node<T>::AL_Node() :m_pPre(NULL), m_pNext(NULL)
{


}

template<typename T>
AL_Node<T>::AL_Node(const T &tTemplate) :m_pPre(NULL), m_pNext(NULL), m_data(tTemplate)
{

}

template<typename T>
AL_Node<T>::~AL_Node()
{
    m_pPre = NULL;
    m_pNext = NULL;
}

#endif // AL_NODE

AL_StackList.h

#ifndef AL_STACKLIST_INCLUDE
#define AL_STACKLIST_INCLUDE

#include "AL_Node.h"


template<typename T>
class AL_StackList
{
public:
    AL_StackList();
    ~AL_StackList();
    //判断栈中是否为空
    bool IsEmpty()const;
    //将元素弹出栈
    bool Pop(T&tTypeOut);
    //将元素压入栈
    bool Push(T&tTemplate);
    //获取栈中储存的元个数
    DWORD Size()const;
    //获取栈顶的元素
    bool Top(T&tTypeOut)const;
    //清空栈中的所有元素
    void Clear();
private:
    AL_Node<T> *m_pHeader;
    DWORD m_dwSize;
};


#endif

template<typename T>
inline AL_StackList<T>::AL_StackList():m_pHeader(NULL),m_dwSize(0x00)
{
    m_pHeader = new AL_Node<T>();
}

template<typename T>
inline AL_StackList<T>::~AL_StackList()
{
    if (m_pHeader!=NULL)
    {
        delete m_pHeader;
        m_pHeader = NULL;
    }
}

template<typename T>
inline bool AL_StackList<T>::IsEmpty() const
{

    return (m_pHeader->m_pNext==NULL)?true:false;
}

template<typename T>
inline bool AL_StackList<T>::Pop(T & tTypeOut)
{
    if (IsEmpty()==true)
    {
        return false;
    }
    AL_Node<DWORD> *pPop = m_pHeader->m_pNext;
    tTypeOut = pPop->m_data;
    m_pHeader->m_pNext = pPop->m_pNext;
    delete pPop;
    pPop = NULL;
    m_dwSize--;
    return true;
}

template<typename T>
inline bool AL_StackList<T>::Push(T & tTemplate)
{
    AL_Node<T> *pPush = new AL_Node<T>();
   if (pPush==NULL)
   {
       return false;
   }
    pPush->m_data = tTemplate;
    pPush->m_pNext = m_pHeader->m_pNext;
    m_pHeader->m_pNext = pPush;
    m_dwSize++;
    return true;
}

template<typename T>
inline DWORD AL_StackList<T>::Size() const
{
    return m_dwSize;
}

template<typename T>
inline bool AL_StackList<T>::Top(T & tTypeOut) const
{
    if (IsEmpty()==true)
    {
        return false;
    }
    AL_Node<T> *pTop = m_pHeader->m_pNext;
    tTypeOut = pTop->m_data;

    return true;
}

template<typename T>
inline void AL_StackList<T>::Clear()
{
    AL_Node<T> *pDelete = NULL;
    while (m_pHeader->m_pNext!=NULL)
    {
        pDelete = m_pHeader->m_pNext;
        m_pHeader->m_pNext = pDelete->m_pNext;
        delete pDelete;
        pDelete = NULL;
    }
    m_dwSize = 0x00;
}

测试代码:

void StackListTest()
{
    AL_StackList<DWORD> cStackList;
    bool bEmpty = cStackList.IsEmpty();
    std::cout << bEmpty << std::endl;

    DWORD dwPop = 0x00;
    cStackList.Pop(dwPop);
    std::cout << dwPop << std::endl;

    DWORD dwTop=0x00;
    cStackList.Top(dwTop);
    std::cout << dwTop << std::endl;

    for (DWORD dwCont=1;dwCont<16;dwCont++)
    {
        DWORD s = 16 - dwCont;
        cStackList.Push(s);
        cStackList.Top(dwTop);
        std::cout << dwTop << std::endl;
    }

}

int main(int argc, char *argv[])
{
    StackListTest();
    getchar();
    return 0;
    }

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值