链式栈的实现
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;
}

浙公网安备 33010602011771号