栈的链式存储结构

      栈的链式存储结构,简称为链栈。

      栈是栈顶来做插入和删除操作,由于单链表有头指针,而栈顶指针也是必须得,所以比较好的办法是把栈顶放在单链表的头部。因为栈顶在头部,单链表中常用的头结点也就失去了意义,通常对于链栈来说。是不需要头结点的。如下图所示:


对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是top=NULL。

链栈的结构代码如下:

typedef struct StackNode
{
    SElemType data;
    struct StackNode *next;
}StackNode,*LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top;
    int count;
}LinkStack;
1.进栈操作

对于链栈的进栈push操作,假设元素值为e的新结点是s,top为栈顶指针,示意图如下:


代码实现如下:

int Push(LinkStack *S, SElemType e)
{
    LinkStackPtr st = (LinkStackPtr)malloc(sizeof(StackNode));
    st->data = e;
    st->next = S->top;  //把当前的栈顶元素赋值给新结点的直接后继
    S->top = st;        //将新的结点st赋值给栈顶指针
    S->count++;
    return OK;

}
2.出栈操作

链栈的出栈pop操作分为三步。假设变量p用来存储要删除的栈顶结点,将栈顶指针下移一位,最后释放p即可,如下图所示:


代码实现如下:

int Pop(LinkStack *S, SElemType *e)
{
    LinkStackPtr p;

    *e = S->top->data;
    p = S->top;                 //将栈顶结点赋值给p
    S->top = S->top->next;      //使得栈顶指针下移一位,指向后一结点
    free(p);                    //释放结点p
    S->count--;
    
    return OK;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值