链栈的实现 C语言

目录

链栈结构

在链栈的结构体中,我们设置一个存储数据的位置和一个指向下一个结构体的指针。然后我们把这个结构体名字设置为stacknode和一个指向这个结构体的指针。StackNode *SListStack S的效果是一样的。只不过新创一个链的时候用前面那个,ListStack S特殊的用来指向链栈头结点。

typedef struct StackNode{
    ElemType data;
    struct StackNode *next;
}StackNode,*ListStack;

创建链栈

我们使用ListStack S特别创建一个头指针。由于我们把头指针传入到初始化函数中,初始化的时候让S指针等于NULL。然后S指针指向的地址就变了,也就是我们在函数中做的操作就没用了。所以我们这个地方就需要用引用。当然,也可以最后把S指针用return返回出来,就不用用引用了。

int InitStack(ListStack &S)
{
    S=NULL;
    return OK;
}

入栈

链栈的入栈操作很类似于链表的前插入法。首先,我们要注意的就是,S指针一直指向的就是栈顶。我们使用StackNode *p;新建一个结点,然后让这个结点指向链栈的原来的栈顶,也就是S指针,这样新创建的结点就入栈了。然后再让S指向新的栈顶p即可。

int Push(ListStack &S,ElemType e)
{
    StackNode *p;
    p =(StackNode *)malloc(sizeof(StackNode));
    p->data = e;
    p->next = S;
    S = p;
    return OK;
}

遍历链栈中元素

没什么好说的,跟顺序栈差不多。本来想要从栈底向栈底遍历,但是没办法。只能从栈顶开始遍历。

int StackTraverse(ListStack S)
{
    StackNode *p;
    p=S;
    printf("--------\n");
    while(p)
    {
        printf("e = %d\n",p->data);
        p = p->next;
    }
    printf("--------\n");
    return OK;
}

出栈

出栈需要把原节点存储空间释放,然后S指向S->next就行。

int Pop(ListStack &S,ElemType *e)
{
    if(S==NULL)
        return ERROR;   //这时是空栈
    *e = S->data;
    StackNode *p;
    p = S;
    S = S->next;
    free(p);
    return OK;

}

取栈顶元素

没什么可说的。


int Gettop(ListStack S)
{
    if(S==NULL)
        return ERROR;
    return S->data;
}

完整代码

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

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

typedef int ElemType;

typedef struct StackNode{
    ElemType data;
    struct StackNode *next;
}StackNode,*ListStack;

int InitStack(ListStack &S);
int Push(ListStack &S,ElemType e);
int StackTraverse(ListStack S);
int Pop(ListStack &S,ElemType *e);
int Gettop(ListStack S);

int main()
{
    int e;
    int cnt=5;
    ListStack S;
    InitStack(S);
    while(cnt)
    {
        scanf("%d",&e);
        Push(S,e);
        cnt--;
    }
    StackTraverse(S);
    Pop(S,&e);
    printf("e = %d\n",e);
    e = Gettop(S);
    printf("e = %d\n",e);
    return 0;
}

int InitStack(ListStack &S)
{
    S=NULL;
    return OK;
}

int Push(ListStack &S,ElemType e)
{
    StackNode *p;
    p =(StackNode *)malloc(sizeof(StackNode));
    p->data = e;
    p->next = S;
    S = p;
    return OK;
}

int StackTraverse(ListStack S)
{
    StackNode *p;
    p=S;
    printf("--------\n");
    while(p)
    {
        printf("e = %d\n",p->data);
        p = p->next;
    }
    printf("--------\n");
    return OK;
}

int Pop(ListStack &S,ElemType *e)
{
    if(S==NULL)
        return ERROR;   //这时是空栈
    *e = S->data;
    StackNode *p;
    p = S;
    S = S->next;
    free(p);
    return OK;

}

int Gettop(ListStack S)
{
    if(S==NULL)
        return ERROR;
    return S->data;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值