数据结构回顾(二)双端栈 (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;

	}

}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值