共用一个一维空间的双向栈

将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。

数据结构定义:

#define MAXSIZE 200
using namespace std;
typedef int ElemType;
typedef struct{
	int bot[2];     //栈0和栈1的栈顶 
	ElemType *base; //栈数组 
	int stacksize;  //栈最大可容纳元素个数 
}DblStack;          //存放于一个数组空间的两个栈 

双栈初始化:

bool InitStack(DblStack &S)
{
	S.base=new ElemType[MAXSIZE];
	if(!S.base) return false;
	S.bot[0]=-1;              //两个栈的栈顶指针都指向栈顶元素 
	S.bot[1]=MAXSIZE;         //
	S.stacksize=MAXSIZE;
	return true;
}

判断栈空:

bool StackEmpty(DblStack S)
{//两个栈均空 
	if(S.bot[0]==-1&&S.bot[1]==S.stacksize)
	    return true;
	return false;
}
bool StackNo_1_Empty(DblStack S)
{//栈1空 
	if(S.bot[0]==-1)
	    return true;
	return false;
}
bool StackNo_2_Empty(DblStack S)
{//栈2空 
	if(S.bot[1]==S.stacksize)
	    return true;
	return false;
}

栈满:

bool StackFull(DblStack &S)
{//栈满 
	return S.bot[0]+1==S.bot[1];
}

进栈:

bool Push(DblStack &S,ElemType e)
{
	if(S.bot[1]-S.bot[0]<=2) return false;//剩余空间不足两个 
	S.base[++S.bot[0]]=e;
	S.base[--S.bot[1]]=e;
	return true;
}
bool Push_No_1(DblStack &S,ElemType e)
{
	if(S.bot[0]+1==S.bot[1]) return false;
	S.base[++S.bot[0]]=e;
	return true;
}
bool Push_No_2(DblStack &S,ElemType e)
{
	if(S.bot[0]+1==S.bot[1]) return false;
	S.base[--S.bot[1]]=e;
	return true;
}

出栈:

bool Pop_No_1(DblStack &S,ElemType &e)
{
	if(S.bot[0]==-1) return false;//栈空 
	e=S.base[S.bot[0]--];         //先取再减 
	return true;
}
bool Pop_No_2(DblStack &S,ElemType &e)
{
	if(S.bot[1]==S.stacksize) return false;//栈空 
	e=S.base[S.bot[1]++];         //先取再加 
	return true;
}

完整:

#include<iostream>
#define MAXSIZE 200
using namespace std;
typedef int ElemType;
typedef struct{
	int bot[2];     //栈0和栈1的栈顶 
	ElemType *base; //栈数组 
	int stacksize;  //栈最大可容纳元素个数 
}DblStack;          //存放于一个数组空间的两个栈 
bool InitStack(DblStack &S)
{
	S.base=new ElemType[MAXSIZE];
	if(!S.base) return false;
	S.bot[0]=-1;              //两个栈的栈顶指针都指向栈顶元素 
	S.bot[1]=MAXSIZE;         //
	S.stacksize=MAXSIZE;
	return true;
}
bool StackEmpty(DblStack S)
{//两个栈均空 
	if(S.bot[0]==-1&&S.bot[1]==S.stacksize)
	    return true;
	return false;
}
bool StackNo_1_Empty(DblStack S)
{//栈1空 
	if(S.bot[0]==-1)
	    return true;
	return false;
}
bool StackNo_2_Empty(DblStack S)
{//栈2空 
	if(S.bot[1]==S.stacksize)
	    return true;
	return false;
}
bool StackFull(DblStack &S)
{//栈满 
	return S.bot[0]+1==S.bot[1];
}
bool Push(DblStack &S,ElemType e)
{
	if(S.bot[1]-S.bot[0]<=2) return false;//剩余空间不足两个 
	S.base[++S.bot[0]]=e;
	S.base[--S.bot[1]]=e;
	return true;
}
bool Push_No_1(DblStack &S,ElemType e)
{
	if(S.bot[0]+1==S.bot[1]) return false;
	S.base[++S.bot[0]]=e;
	return true;
}
bool Push_No_2(DblStack &S,ElemType e)
{
	if(S.bot[0]+1==S.bot[1]) return false;
	S.base[--S.bot[1]]=e;
	return true;
}
bool Pop_No_1(DblStack &S,ElemType &e)
{
	if(S.bot[0]==-1) return false;//栈空 
	e=S.base[S.bot[0]--];         //先取再减 
	return true;
}
bool Pop_No_2(DblStack &S,ElemType &e)
{
	if(S.bot[1]==S.stacksize) return false;//栈空 
	e=S.base[S.bot[1]++];         //先取再加 
	return true;
}
int main()
{
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值