链式栈的实现

vs2013下编写的项目工程见 我的 github: https://github.com/excelentone/DataStruct

LinkStack.h

#include "StackNode.h"

template<typename T> 
class LinkStack
{
public:
    LinkStack() :_pTop(NULL)
    {}
    ~LinkStack()
    {
        MakeEmpty();
    }

public:
    void MakeEmpty();          
    void Push(const T item); 
    T Pop();                 
    T GetTop() const;        
    void Print();               

    bool IsEmpty() const
    {
        return _pTop == NULL;
    }

private:
    StackNode<T> *_pTop;
};

template<typename T> 
void LinkStack<T>::MakeEmpty()
{
    StackNode<T> *pmove;
    while (_pTop != NULL)
    {
        pmove = _pTop;
        _pTop = _pTop->_pNext;
        delete pmove;
    }
}

template<typename T>
void LinkStack<T>::Push(const T item)
{
    _pTop = new StackNode<T>(item, _pTop);
}

template<typename T> 
T LinkStack<T>::GetTop() const
{
    if (IsEmpty())
    {
        cout << "There is no elements!" << endl;
        exit(1);
    }
    return _pTop->_data;
}

template<typename T>
T LinkStack<T>::Pop()
{
    if (IsEmpty())
    {
        cout << "There is no elements!" << endl;
        exit(1);
    }
    StackNode<T> *pdel = _pTop;
    _pTop = _pTop->_pNext;
    T temp = pdel->_data;
    delete pdel;
    return temp;
}

template<typename T>
void LinkStack<T>::Print()
{
    StackNode<T> *pmove = _pTop;
    cout << "buttom";
    while (pmove != NULL)
    {
        cout << "--->" << pmove->_data;
        pmove = pmove->_pNext;
    }
    cout << "--->top" << endl << endl << endl;
}

StackNode.h

template<typename T> 
class LinkStack;

template<typename T> 
class StackNode
{
private:
    friend class LinkStack < T > ;
    StackNode(T dt, StackNode<T> *next = NULL)
        :_data(dt)
        , _pNext(next)
    {}
private:
    T _data;
    StackNode<T> *_pNext;
};

test.cpp

#include <iostream>
using namespace std;

#include "LinkStack.h"
void test()
{
    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();
}
int main()
{
    test();

    system("pause");
    return 0;
}

posted @ 2017-06-08 22:34  乐天的java  阅读(33)  评论(0)    收藏  举报