一个菜鸟的数据结构学习之路(栈篇)

栈的基本操作如下:

  • 相关结构体:
typedef int status;

typedef struct
{
    SElemType *base; //在栈创建之前和销毁之后,base的值为NULL
    SElemType *top; //栈顶指针
    int stacksize; //当前已分配的储存空间,以元素为单位
}SqStack;
  • 相关宏定义:
# define STACK_INIT_SIZE 100
# define STACKINCREMENT 10
# define OK 1
# define ERROR
  • 相关函数声明:
Status InitStack(SqStack &S); /*构造一个空栈S*/

Status DestoryStack(SqStack &S); /*销毁栈S,S不再存在*/

Status ClearStack(SqStack &S); /*把栈S置为空栈*/

Status StackLength(SqStack S); /*返回栈S的元素个数,即栈长*/

Status GetTop(SqStack S,SElemType &e);/*若栈不为空,则用e返回S的栈顶元素,成功则返回OK,否则返回ERROR*/

Status Push(SqStack &S,SElemType &e); /*在栈S的栈顶插入元素e为新的栈顶元素*/

Status Pop(SqStack &S,SElemType &e); /*若栈不为空,则删除栈顶元素,用e返回此值,成功则返回OK,否则返回ERROR*/
  • 构造空栈S:
Status InitStack(SqStack &S); /*构造一个空栈S*/
{
    S.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE); //分配内存
    if(!S.base)
        exit(ERRORFLOW);
    S.top = S.base; //将base置于栈顶
    S.stacksize = STACKINCREMENT; //定义栈S的长度
    return OK;
}
  • 销毁栈S:
Status DestoryStack(SqStack &S); /*销毁栈S,S不再存在*/
{
    S.top = S.base = NULL;
    return OK;
}
  • 把栈S置空:
Status ClearStack(SqStack &S); /*把栈S置为空栈*/
{
    S.top = S.base; //栈顶为空
    stacksize = 0; //已分配空间置0
}
  • 栈长:
Status StackLength(SqStack S); /*返回栈S的元素个数,即栈长*/
{
    return stacksize;
}
  • 用e返回栈顶元素:
Status Push(SqStack &S,SElemType &e); /*在栈S的栈顶插入元素e为新的栈顶元素*/
{
    if(S.top - S.base >= S.stacksize) //栈已满,追加内存分配
    {
    S.base = (SElemType *)relloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
    if(!S.base)
        exit(OVERFLOW); //内存分配失败
    S.top = S.base + S.stacksize; //栈顶地址
    S.stacksize = S.stacksize + STACKINCREMENT; //当前栈的空间
    }
    *S.top++ = e; //将e插入栈顶
    return OK;
}
  • 在栈顶插入元素e:
Status Push(SqStack &S,SElemType &e); /*在栈S的栈顶插入元素e为新的栈顶元素*/
{
    if(S.top - S.base >= S.stacksize) //栈已满,追加内存分配
    {
    S.base = (SElemType *)relloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
    if(!S.base)
        exit(OVERFLOW); //内存分配失败
    S.top = S.base + S.stacksize; //栈顶地址
    S.stacksize = S.stacksize + STACKINCREMENT; //当前栈的空间
    }
    *S.top++ = e; //将e插入栈顶
    return OK;
  • 退栈并用e返回被删除的栈顶元素:
Status Pop(SqStack &S,SElemType &e); /*若栈不为空,则删除栈顶元素,用e返回此值,成功则返回OK,否则返回ERROR*/
{
    if(S.base == S.top)
        return ERROR;
    e = *--S.top; //把栈顶元素的值赋给e
    return OK;
}
  • 主函数:
int main(void)
{
    SqStack S;
    InitStack(&S);
    int choice;
    SElemType e;
    while(1)
    {
        printf("*************************************************\n");
        printf("*[1]栈的长度          [2]栈顶插入新元素             *\n");
        printf("*[3]将栈S清空         [4]销毁栈S                  *\n");
        printf("*[5]退栈并返回其值     [6]获得栈顶元素              *\n");
        printf("*                   [0]退出                     *\n");
        printf("*************************************************\n");
        scanf("%d",&choice);
        switch(choice)
        {
            case 0: break;

            case 1: StackLength(S);break;

            case 2: scanf("%d",&e);Push(&S,e);break;

            case 3: ClearStack(&S);break;

            case 4: DestoryStack(&S);break;

            case 5: Pop(&S,e);break;

            case 6: GetTop(s,e);break; 
        }
    }
return 0;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值