[C++]数据结构:链表形式的堆栈LinkedStack类

本文介绍了一种使用链表实现的堆栈数据结构。该堆栈支持基本操作如PushStack(入栈)、PopStack(出栈)及Top(查看栈顶元素),并提供了检查堆栈是否为空或满的方法。
//自定义链表形式的堆栈
#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值