顺序栈的基本操作包括:初始化、入栈、出栈、取栈顶元素四个操作。下面是实现代码:
在初始化之前,老规矩,先进行预定义:
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
typedef intSElemType;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
初始化:
Status InitStack(SqStack*S)
{
S->base = (SElemType*)malloc(MAXSIZE*sizeof(SElemType));
if (!S->base)
return ERROR;
S->top = S->base;
S->stacksize = MAXSIZE;
return OK;
}
初始化的目的是为了给顺序栈分配足够的储存空间,之后判断是否分配成功,如果分配成功的话,由于没有任何元素,故将栈底地址赋值给栈顶(S->top),将分配的空间大小赋值给S->stacksize。
入栈:
Status Push(SqStack *S,SElemType e)
{
if ((S->top - S->base) == S->stacksize)
return ERROR;
*(S->top) = e;
S->top++;
return OK;
}
入栈的时候,必须判断顺序栈是否有足够的空间储存新元素,如果栈顶地址减栈底地址等于最大储存长度,说明顺序栈已经没有足够的空间,则返回错误。如果还有剩下足够的空间,将e的值储存在栈顶,并让栈顶指针S->top后移一位。
出栈:
Status Pop(SqStack *S,SElemType *e)
{
if (S->top == S->base)
return ERROR;
*e = *(--S->top);
return OK;
}
出栈的时候需要判断栈是否为空栈,如果是空栈返回错误。不为空栈的话将栈顶前一位的元素值赋值给*e,并让栈顶指针S->top前移一位,因为顺序栈中栈顶是任然未赋值的元素。
取栈顶元素:
SElemType GetTop(SqStackS)
{
if (S.base == S.top)
return ERROR;
return *(S.top - 1);
}
和出栈一样,取栈顶元素同样需要判断是否为空栈,如果是空栈返回错误。如果不为空栈,返回栈顶的前一位元素的值。
加入main()测试:
int main(void)
{
int n;
SqStack S;
SElemType e, *p;
p = &e;
printf("1.初始化\n2.入栈\n3.出栈\n4.取栈顶元素\n5.退出\n");
while (1)
{
printf("请选择:");
scanf("%d", &n);
switch (n)
{
case 1:
if ((InitStack(&S)) == OK)
printf("初始化成功!\n");
else
printf("初始化失败!\n");
break;
case 2:
printf("输入你要入栈的元素:");
scanf("%d", &e);
if ((Push(&S, e)) == OK)
printf("入栈成功!\n");
else
printf("入栈失败!\n");
break;
case 3:
if ((Pop(&S, p)) == OK)
printf("%d已经出栈\n",*p);
break;
case 4:
printf("栈顶元素为:%d\n",GetTop(S));
break;
case 5:
exit(0);
}
}
return 0;
}