将编号为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()
{
}