1. 程式人生 > >C++ 順序棧類實現

C++ 順序棧類實現

//還不是很完善,應該在壓棧時若棧滿了自動擴大棧
#include<iostream>

using namespace std;

#define MAXSIZE 100
typedef int ELETYPE;

class Stack
{
private:
	ELETYPE *base;//棧底
	int top;//棧頂
	int stacksize;//棧空間
public:
	Stack();
	~Stack();
	bool IsEmpty();//是否為空棧
	bool ClearStack();//清空棧
	int StackLength();//棧長度
	bool PushStack(ELETYPE a);//壓棧
	bool PopStack(ELETYPE &a);//出棧
	bool TopStack(ELETYPE &a);//返回棧頂元素
	bool IsFull();//棧是否滿了
};

bool Stack::TopStack(ELETYPE &a)
{
	if(-1==top)
		return false;
	a=base[top];
}

bool Stack::IsFull()
{
	//if(stacksize-1==top)
	//	return true;
	//return false;
	return top==stacksize-1;//這種寫法更為簡潔
}

bool Stack::PopStack(ELETYPE &a)
{
	if(-1==top)
		return false;
	a=base[top--];
	return true;
}

bool Stack::PushStack(ELETYPE a)
{
	if(top==stacksize-1)
		return false;
	base[++top]=a;
	return true;
}

int Stack::StackLength()
{
	return top+1;
}

bool Stack::ClearStack()
{
	top=-1;//這樣是有問題的
	return true;
}

bool Stack::IsEmpty()//空棧返回true,否則返回false
{
	if(-1==top)
		return true;
	return false;
}

Stack::Stack()
{
	top=-1;//陣列第一個元素下標為0,所以用-1來表示空棧
	stacksize=MAXSIZE;
	base=new ELETYPE[MAXSIZE];
}

Stack::~Stack()
{
	delete []base;//解構函式不會自動回收new的空間,所以在解構函式裡手動delete   new的空間
}

void main()
{
	Stack sta;
	for(int i=0;i<10000;++i)
	{
		if(!sta.PushStack(i))
			break;
	}
	int a;
	for(;sta.StackLength()!=0;)
	{
		sta.PopStack(a);
		cout<<a<<" ";
	}
}