數據結構回顧(二)雙端棧 (C++實現)

/*
設有兩個堆棧S1,S2都採用順序棧方式,並且共享一個存儲區【0,…,maxsize-1】,爲了儘量利用空間,
減少溢出的可能,可採用棧頂相向、迎面增長的存貯方式,試設計s1,s2有關的入棧和出棧的操作算法。Sqstack.cpp

*/
//模擬 stl 裏的 dequeue 思想  但此處是棧   而且是兩個棧
#include <iostream>
#include <string>
#define initsize 5
#define addsize 5
#define Datatype int
using namespace std;
class Stack
{
private:
	Datatype *Data;
	int top;//正向棧頂
	int rtop;//反向棧頂
	int size;
public:
	Stack()						//構造函數,完成棧的初始化
	{
		//Data=new Datatype(initsize);
		Data=(Datatype* )malloc(initsize*sizeof(Datatype));
		top=0;						//從0開始存儲數據		
		size=initsize;
		rtop=size-1;			//反向棧從length-1開始	
	}
	bool isempty1()//判斷正向棧是否爲空
	{
		if(this->top==0)
		{
			return true;
		
		}
		else
		{
			return false;
		
		}
	
	}
	bool isempty2()//判斷反向棧是否爲空
	{
		if(this->rtop==size-1)
		{
			return true;
		
		}
		else
		{
			return false;
		
		}
	
	}
	bool isfull()
	{
		if((this->top-1)==this->rtop)
		{
			return true;
		
		}
		else
		{
			return false;
		
		}
	
	}
	bool push(Datatype data);		//進棧
	bool pop(Datatype &data);		//出棧
	bool rpush(Datatype data);		//反向棧進棧
	bool rpop(Datatype &data);		//反向棧出棧
	bool expand_zone();				//擴容
	void trave();				//遍歷棧
	void manu_show_and_choice();
	~Stack()						//析構函數(釋放空間)
	{
		delete []Data;
		top=0;
		size=0;
		rtop=this->size-1;
		Data=NULL;
	
	}

};
bool Stack::push(Datatype data)
{
	if(this->isfull())
	{
		if(!this->expand_zone())
		{
			cout<<"fail!"<<endl;
			return false;
		}


	}


	
	this->Data[this->top++]=data;
	
	return true;


}
bool Stack::rpush(Datatype data)
{
	if(this->isfull())
	{
		if(!this->expand_zone())
		{
			cout<<"fail!"<<endl;
			return false;
		}

	}


	this->Data[this->rtop--]=data;
	return true;


}
bool Stack::pop(Datatype &data)
{
	if(this->isempty1())
	{
		return false;
	
	}
	else
	{
		cout<<"top : "<<top<<endl;
		data=this->Data[--(this->top)];
		return true;
	
	}

}
bool Stack::rpop(Datatype &data)
{
	if(this->isempty2())
	{
		return false;
	
	}
	else
	{
		data=this->Data[++this->rtop];
		return true;
	
	}

}
bool Stack::expand_zone()											//擴容
{
	
	//Datatype *newdata=new Datatype(this->size+addsize);
	Datatype *newdata=(Datatype*)malloc((addsize+initsize)*sizeof(Datatype));
	if(!newdata)
	{
		return false;
	
	}
	else
	{
		int t;//計數器
		
		for(t=0;t<this->top;t++)
		{
		
			newdata[t]=this->Data[t];
			
		
		}	

	
		for(t=this->size-1;t>this->rtop;t--)
		{
			newdata[t+addsize]=this->Data[t];
		
		}
		this->rtop=t+addsize;//保存反向棧棧頂位置


		this->size+=addsize;//保存棧大小
	
		delete []this->Data;//釋放原棧數據空間  error!
	

		this->Data=newdata;//改變地址
	

		return true;
	}

}
void Stack::trave()				//遍歷棧
{
	if(this->isempty1() && this->isempty2())
	{
		cout<<"雙棧空!"<<endl;
	
	}
	else
	{
		int i=0;
		cout<<"遍歷如下: "<<endl;
		for(i=0;i<this->size;i++)
		{

			cout<<" "<<this->Data[i];
		}
		cout<<endl;

	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章