C语言顺序栈的基本操作


顺序栈的基本操作包括:初始化、入栈、出栈、取栈顶元素四个操作。下面是实现代码:

在初始化之前,老规矩,先进行预定义:

#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;
}



C语言顺序栈的基本操作


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值