栈的顺序存储实现
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。
#define MaxSize <存储数据元素的最大个数>
typedef struct SNode *Stack;
struct SNode
{
ElementType Data[MaxSize];
int Top;
};
(1)入栈
void Push(Stack Ptrs,ElementType item)
{
if (PtrS->Top == MaxSize-1)
{
printf("堆栈满");
return;
}
else
{
PtrS->Data[++(PtrS->Top)]=item; //利用++(PtrS->Top)既把item放到top+1位置,又将top+1;
return;
}
(2)出栈
ElementType Pop(stack PtrS)
{
if (PtrS->Top==-1)
{
printf("堆栈空");
return ERROR // ERROR是ElementType的特殊值,标志错误
}
else
return (PtrS->Data[PtrS->Top--]);
}
[例]请用一个数组实现两个堆栈,要求最大地利用数组空间,使数组只要有空间入栈操作就可以成功
[分析]一种比较聪明的方法是使这两个栈分别从数组的两头开始向中间生长;当两个栈顶指针相遇时,表示两个栈都满了
#define MaxSize <存储数据元素的最大个数>
struct DStack
{
ElementType Data[MaxSize];
int Top1;
int Top2;
}S;
S.Top1=-1;S.Top2=MaxSize;
// 入栈
void Push(struct DStack *PtrS,ElementType item,int Tag)
{
// Tag作为区分两个堆栈的标志,取值为1和2
if (PtrS->Top2 - PtrS->Top1==1)
{
printf("堆栈满");
return;
}
if (Tag==1)
PtrS->Data[++(PtrS->Top1)]=item;
else
PtrS->Data[--(PtrS->Top1)]=item;
}
// 出栈
void Push(struct DStack *PtrS,int Tag)
{
if (Tag==1)
{
if (PtrS->Top1==-1)
{
printf("堆栈1空");
return NULL;
}
else
return PtrS->Data[(PtrS->Top1)--];
}
else
{
if (PtrS->Top1==MaxSize)
{
printf("堆栈2空");
return NULL;
}
else
return PtrS->Data[(PtrS->Top2)++];
}
}