/*
設有兩個堆棧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;
}
}
數據結構回顧(二)雙端棧 (C++實現)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.