顺序栈的实现 C语言

目录

顺序栈的定义

SElemYType代表着任意的数据类型,比如int,char,float之类的。我们可以根据具体情况代换,这里我是用typedef语句将SElemType表示为int。typedef int SElemType;
在SqStack结构体中,我们定义了两个指针top和base分别指向栈顶和栈底,定义了一个int变量来存储栈的最大容量。

typedef struct 
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

初始化

使用malloc函数分配maxsize大小的空间,并让base指针指向这片空间。让top指针等于base指针,这时代表空栈。

int InitStack(SqStack *S)
{
    S->base = (SElemType *)malloc(MAXSIZE * sizeof(SElemType));
    if(!S->base)
        exit(OVERFLOW);
    S->top = S->base;
    S->stacksize = MAXSIZE;
    return OK;
}

入栈

入栈第一步要判断现在top指针减去base指针是否等于栈的最大容量,如果是的话直接退出函数。也许大家不懂*S->top是什么意思,S->top是一个指针,*S->top代表的就是这个地址存储的数值。

int Push(SqStack *S,SElemType e)
{
    if(S->top - S->base == S->stacksize)
        return ERROR;        //栈满
    *S->top = e;
    S->top++;
    return OK;
}

遍历栈的元素

为了能够更好的查看我们的函数对于栈中元素的操作,我写了这个遍历函数。注意这个函数是从栈底开始遍历栈中元素的。

int StackTraverse(SqStack *S)
{
    SElemType *p;
    p=S->base;
    while(p!=S->top)
    {
        printf("%d\n",*p);
        p++;
    }
    return OK;
}

出栈

出栈的流程于入栈刚好相反。在取出栈顶元素之前要判断栈是否为空。

int Pop(SqStack *S,SElemType *e)
{
    if(S->top == S->base)
        return ERROR;       //栈空
    e = S->top;
    S->top--;
    return OK;
}

取栈顶元素

取栈顶元素只需要把top指针指向的元素返回就行。

SElemType GetTop(SqStack *S)
{
    if(S->top != S->base)
        return *S->top;
}

获取栈的长度

栈的长度为栈顶指针减去栈底指针。

int StackLength(SqStack *S)
{
    int length;
    length = S->top-S->base;
    return length;
}

清空栈

清空栈只需要将栈底指针定于栈顶指针即可。

int ClearStack(SqStack *S)
{
    S->top = S->base;
    return OK;
}

完整代码

#include<stdio.h>
#include <stdlib.h>

#define MAXSIZE 100
#define OVERFLOW -1
#define OK 1
#define ERROR 0

typedef int SElemType;     //根据需要定义SElemType的数据类型
typedef struct 
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

int InitStack(SqStack *S);
int Push(SqStack *S,SElemType e);
int StackTraverse(SqStack *S);
int Pop(SqStack *S,SElemType *e);
SElemType GetTop(SqStack *S);
int StackLength(SqStack *S);
int ClearStack(SqStack *S);

int main()
{
    SqStack S;
    InitStack(&S);
    int e;
    int length;
    int cnt=5;

    /*我这里是为了图省事,没想到更好的循环结束的条件,
    直接使用5次push函数创建一个栈方便后续操作,大家明白就好
    */
    while(cnt)
    {
        scanf("%d",&e);
        Push(&S,e);
        cnt--;
    }
    printf("-----------\n");
    StackTraverse(&S);
    length = StackLength(&S);
    printf("length:%d\n",length);
    printf("-----------\n");
    Pop(&S,&e);
    printf("出栈元素的值:%d\n",e);
    StackTraverse(&S);
    printf("-----------\n");
    e=GetTop(&S);
    printf("栈顶元素的值:%d\n",e);
    return 0;

}

int InitStack(SqStack *S)
{
    S->base = (SElemType *)malloc(MAXSIZE * sizeof(SElemType));
    if(!S->base)
        exit(OVERFLOW);
    S->top = S->base;
    S->stacksize = MAXSIZE;
    return OK;
}

int Push(SqStack *S,SElemType e)
{
    if(S->top - S->base == S->stacksize)
        return ERROR;        //栈满
    *S->top = e;
    S->top++;
    return OK;
}

int StackTraverse(SqStack *S)
{
    SElemType *p;
    p=S->base;
    while(p!=S->top)
    {
        printf("%d\n",*p);
        p++;
    }
    return OK;
}

int Pop(SqStack *S,SElemType *e)
{
    if(S->top == S->base)
        return ERROR;       //栈空
    e = S->top;
    S->top--;
    return OK;
}

SElemType GetTop(SqStack *S)
{
    if(S->top != S->base)
        return *S->top;
}

int StackLength(SqStack *S)
{
    int length;
    length = S->top-S->base;
    return length;
}

int ClearStack(SqStack *S)
{
    S->top = S->base;
    return OK;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值