top==-1 --> 堆栈空
top==0 -->下标为0的地方有一个元素(从0到Maxsize-1)
静态栈:先加后压 先抬后减
#define Maxsize 100
typedef struct stack_
{
int data[Maxsize];//数组
int top;//栈顶元素在数组中的位置
}*Stack;//结构体指针
入栈:(先判断堆栈是否已满)
void push(Stack ptrs,int item)//入栈
{
if(ptrs->top==Maxsize-1) cout<<"堆栈满";//0到Maxsize-1
else
ptrs->data[++(ptrs->top)]=item;//先top++,再压入元素
}
出栈:(先判断堆栈是否为空)
int pop(Stack ptrs)//出栈
{
if(ptrs->top==-1)
{
cout<<"栈空";
return -1;
}
else
return ptrs->data[(ptrs->top)--];//先抬出元素,后top--
}
题:请用一个数组实现两个堆栈,要求最大地利用数组空间,使数组只要有空间入栈操作就可以成功。
解法:使两个栈分别从数组的两头开始向中间生长,当两个栈的栈顶指针相遇时,表示两个栈都满了。
#define Maxsize 100
struct stack_
{
int data[Maxsize];
int top1;//堆栈1的栈顶指针
int top2;//堆栈2的栈顶指针
}Stack;
S.top1=-1;//左边最小为0
S.top2=Maxsize;//右边最大为Maxsize-1
void push(struct stack_ *ptrs,int item,int tag)//tag作为区分两个堆栈的标志,取值为1和2
{
if(ptrs->top2 - ptrs->top1==1)//堆栈满
cout<<"栈满";
if(tag==1)//对第一个堆栈操作
ptrs->data[++(ptrs->top1)]=item;
else//对第二个堆栈操作
ptrs->data[--(ptrs->top2)]=item;
}
int pop(struct stack_* ptrs,int tag)
{
if(tag==1)
{
if(ptrs->top1==-1) cout<<"堆栈1空"<<endl;
else
return ptrs->data[(ptrs->top1)--];
}
else
{
if(ptrs->top2==Maxsize) cout<<"堆栈2空"<<endl;
else
return ptrs->data[(ptrs->top2)++];
}
}