//自定义链表形式的堆栈
#include<iostream>
using namespace std;
template<class T>
class Node{
public:
T data;
Node<T> *link;
};
template<class T>
class LinkedStack{
public:
LinkedStack(){top=0;}
~LinkedStack();
bool IsEmpty()const{return top==0;}
bool IsFull()const;
T Top()const;
LinkedStack<T>& PushStack(const T&x);
LinkedStack<T>& PopStack(T&x);
Node<T> *top;
void Show()const;
};
class OutOfBounds{
public:
OutOfBounds(){
cout<<"Out Of Bounds!"<<endl;
}
};
//内存不足的异常类
class NoMem{
public:
NoMem(){
cout<<"No Memory!"<<endl;
}
};
//使new引发NoMem异常而不是xalloc异常
//如果要恢复原始行为可以做以下调用
//_set_new_handler(Old_Handler);
int my_new_handler(size_t size){
throw NoMem();
}
template<class T>
void LinkedStack<T>::Show()const{
Node<T> *current = top;
while(current) {
cout<<current->data<<endl;
current=current->link;
}
}
//堆栈的析构方法
template<class T>
LinkedStack<T>::~LinkedStack(){
Node<T>*next;
while(top){
next=top->link;
delete top;
top=next;
}
}
//判断当前的堆栈有木有满载
template<class T>
bool LinkedStack<T>::IsFull()const{
try{
Node<T>*p = new Node<T>;
delete p ;
return false;
}catch(NoMem){
return true;
}
}
//返回当前堆栈的头元素数据
template<class T>
T LinkedStack<T>::Top()const{
if(IsEmpty())
throw OutOfBounds();
return top->data;
}
//将数据压进堆栈
template<class T>
LinkedStack<T>& LinkedStack<T>::PushStack(const T&x){
Node<T>*p = new Node<T>;
p->data = x;
p->link = top;
top = p;
return *this;
}
//删除栈顶元素并将其送入x
template<class T>
LinkedStack<T>&LinkedStack<T>::PopStack(T&x){
if(IsEmpty())
throw OutOfBounds();
x=top->data;
Node<T>*p = top ;
top = top->link;
delete p;
return *this;
}
int main(){
LinkedStack<int> myStack;
myStack.PushStack(1);
myStack.PushStack(2);
myStack.PushStack(3);
myStack.PushStack(4);
myStack.PushStack(5);
myStack.PushStack(6);
myStack.Show();
int popNode;
myStack.PopStack(popNode);
cout<<"Pop One From Stack : "<<popNode<<endl;
myStack.Show();
return 0;
}
[C++]数据结构:链表形式的堆栈LinkedStack类
最新推荐文章于 2022-04-07 18:05:16 发布
