上篇文章list忘了声明一点,此链表带有一个亚元节点(即不存放数据,只记录第一个链表节点位置的节点)。这次的这个Stack也是一个带有亚元节点的Stack。
这个实现基本上把Stack该有的基本的东西都实现了,比如说:判空,判满,出栈,入栈等等。后续还会有个人写的基本的数据结构的贴上来。
好了再次我就不多说了直接贴代码:
#include<exception>
#include<iostream>
using namespace std;
template <class T>
class Stack
{
public:
struct node{
T data;
node* next;
node(const T data = T()):data(data),next(NULL){}
};
Stack(int _max=0):max(_max),size(0){head = new node();}
virtual ~Stack();
void stackPush(const T&);
T stackPop();
bool stackEmpty();
bool stackFull();
void show();
void clear();
void setNode(node*,const T&);
int getSize()const { return size;}
private:
int size;
int max;
node* head;
};
template <class T>
void Stack<T>::clear()
{
node* p = head;
while(p->next!=NULL)
{
node* temp;
temp = p;
p = p->next;
--size;
delete temp;
}
}
template <class T>
Stack<T>::~Stack()
{
clear();
}
template <class T>
void Stack<T>::setNode(node* resultNode,const T& data)
{
node* no = new node();
if(no!=NULL){
no->data = data;
no->next = resultNode->next;
resultNode->next = no;
}
++size;
}
template <class T>
void Stack<T>::stackPush(const T& data)
{
if(stackFull())
{
throw "Stack is full !!";
}
if(head==NULL)
{
head = new node();
}
node* p = head;
setNode(p,data);
}
template <class T>
T Stack<T>::stackPop()
{
if(stackEmpty())
{
throw "Stack is empty !!";
}
T data = head->next->data;
node* p = head->next->next;
delete head->next;
head->next = p;
--size;
return data;
}
template <class T>
void Stack<T>::show()
{
node* p = head->next;
cout<<"Stack< ";
while(p!=NULL)
{
cout<<p->data<<' ';
p = p->next;
}
cout<<" > ";
cout<<endl;
}
template <class T>
bool Stack<T>::stackEmpty()
{
return (head->next)==NULL;
}
template <class T>
bool Stack<T>::stackFull()
{
return size==max;
}
代码不是很多,大家只需要拷出来加上main函数就可以运行。