/*
设有两个堆栈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++实现)
最新推荐文章于 2024-04-24 06:00:00 发布