C++ 栈

/**************************
	stack implement by C++
			LAQ  2013.3.15
********************************/
#include <iostream>
#include <string>
using namespace std;
template<typename T> class MyStack  
{
public:
	MyStack():top(0),base(0),stacksize(0){}
	bool InitStack();	
	bool ClearStack();
	bool StackEmpty() const;
	int StackLength() const;
	T& GetTop()
	{
		if (top==base)
		{
			exit(1); 
		}
		return *(top-1);
	}
	MyStack& Push(T &t)
	{
		if (top-base>=stacksize)
		{
			T *same_base=base;
			T *same_top=top;
			top=base=new T[INCREMENTSIZE+INITSTACKSiZE];
			while (same_top!=same_base)
			{
				*top++=*same_base++;
			}
			//top=base+stacksize;
			stacksize+=INCREMENTSIZE;
		}
		*top++=t;
		return *this;
	}
	MyStack& Pop()
	{
		if (top==base)
		{
			exit(1);
		}
		--top;
		return *this;
	}

	bool StackTraverse();
	~MyStack()
	{
		DestoryStack();
	}
private:
	MyStack(const MyStack &); //   declare but not defined:forbit to use copy constructor              
	bool DestoryStack();
	T *top;
	T *base;
	int stacksize;
	static int INITSTACKSiZE;
	static int INCREMENTSIZE;
};

template<typename T> int MyStack<T>::INITSTACKSiZE=10;
template<typename T> int MyStack<T>::INCREMENTSIZE=10;


template<typename T> bool MyStack<T>::ClearStack()
{

	// misss try catch excpetion hander
	DestoryStack();
	InitStack();

	return true;
}
template<typename T> bool MyStack<T>::InitStack()
{
	base=new T[INITSTACKSiZE];
	if(!base)
		exit(1);
	top=base;
	stacksize=INITSTACKSiZE;
	return true;
}
template<typename T> bool MyStack<T>::StackEmpty() const
{
	if (base==top)
	{
		return true;
	}
	return false;
}
template<typename T> bool MyStack<T>::DestoryStack()
{
	delete[] base;

	return true;
}

template<typename T> int MyStack<T>::StackLength() const
{
	return top-base;
}
//template<typename T> MyStack& MyStack<T>::Push(T &t)

//template<typename T> MyStack& MyStack<T>::GetTop() const

//template<typename T> MyStack& MyStack<T>::Pop()
template<typename T> bool MyStack<T>::StackTraverse()
{
	// CAUTION HERE
	T *traver=base;
	if (traver==0)
	{
		return false;
	}
	while (traver!=top)
	{
		cout<<*traver<<endl;
		traver++;
	}
	return true;
}

int main(void)
{
//	int a=2;
	string a="123";
	MyStack<string> ms;
	ms.InitStack();

	// 13
	ms.Push(a);
	ms.Push(a);
	ms.Push(a);
	ms.Push(a);
	ms.Push(a);
	ms.Push(a);
	ms.Push(a);
	ms.Push(a);
	ms.Push(a);
	ms.Push(a);
	ms.Push(a);
	ms.Push(a);
	ms.Push(a);
	
	ms.Pop();
	ms.Pop();
	ms.Pop();
	// 10
	ms.StackTraverse();
	//ms.ClearStack();	

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值