1. 程式人生 > >棧和鏈棧的實現及其相關操作詳解

棧和鏈棧的實現及其相關操作詳解

#include <iostream>
#include <typeinfo>
using namespace std;
/*用模板實現鏈式棧和鏈式佇列,採用繼承結構*/

template<typename T>
class DSBase
{
public:
virtual void push(const T &val) = 0;
virtual void pop() = 0;
virtual void show() = 0;
virtual T front()const = 0;
virtual T back()const = 0;
};
template<typename T>
class Stack : public DSBase<T>
{
public:
//構造 析構  重寫5個抽象方法
Stack();
~Stack();
virtual void push(const T &val) ;
virtual void pop() ;
virtual void show() ;
virtual T front()const ;
virtual T back()const ;
private:
struct Node
{
public:
Node(T data = T())
:mdata(data), mpnext(NULL),mprio(NULL){}
T mdata;
Node *mpnext;
Node *mprio;
};
Node *mpbottom;
Node *mptop;
};
template<typename T>
Stack<T>::Stack()
{
mpbottom = new Node();
mptop = new Node();
mpbottom->mprio = mptop;
mptop->mpnext = mpbottom;


}
template<typename T>
Stack<T>::~Stack()
{
if(NULL == mptop)
return;
Node* pcur = mptop;
while(mptop != mpbottom)
{
mptop = mptop->mpnext;
delete pcur;
pcur = mptop;

}
}
template<typename T>
void Stack<T>:: push(const T &val)
{
Node* pnode = new Node(val);
pnode->mprio = mptop;
pnode->mpnext = mptop->mpnext;
mptop->mpnext = pnode;
pnode->mpnext->mprio = pnode;


}
template<typename T>
void Stack<T>:: pop() 
{
if(mpbottom == mptop) return;
Node* pcur = mptop ;
mptop = mptop->mpnext;
delete pcur;

}
template<typename T>
void Stack<T>::show() 
{
Node* pcur = mptop->mpnext;
while(pcur != mpbottom)
{
cout<<pcur->mdata<<" ";
pcur = pcur->mpnext; 
}
cout<<endl;
}
template<typename T>
 T Stack<T>::front()const 
{
if(mptop == mpbottom)return 0;
return mpbottom->mprio->mdata;
}
template<typename T>
T Stack<T>::back()const 
{
if(mptop == mpbottom)return 0;
return mptop->mpnext->mdata;
}


int main()
{
Stack<int> stack1;
stack1.push(1);
stack1.push(2);
stack1.push(3);
stack1.push(4);
stack1.show();
cout<<stack1.back()<<endl;
cout<<stack1.front()<<endl;
stack1.pop();
stack1.show();
return 0;
 }