栈的链式存储结构

栈的链式存储结构(链栈):栈顶放在链表的头部,top为头指针,所以基本不存在栈满的情况且无头结点。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 空栈:top=NULL

链栈的结构代码:

// 定义结点

typedef struct StackNode

{

    type data;

    struct StackNode *next;

}StackNode , *LinkStactPtr;

// 定义头指针

typedef struct LinkStact

{

    LinkStactPtr=top;

    int count;

}LinkStact;

 

链栈的进栈操作:

若让新元素 s 进栈,首先把栈顶元素赋给 s 的直接后继指针,然后把 s 的地址赋给top指针。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 // 代码实现

Status Push(LinkStack *S , type e)

{   

LinkStactPtr s=    // 给元素 s 分配空间

(LinkStactPtr)malloc(sizeo(StackNode) );

s->data=e;    // 存入数据 e

s->next=S->top;    // 让s的指针域指向top

S->top=s;    // 让 top 指向s

S->count++;    // 链栈的结点的个数+1

return OK;

}

 

链栈的出栈操作:

若要删除栈顶结点 ai ,首先创建结点p存储结点ai,把top指针后移一位,释放p结点。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 代码实现:

Status Pop(LinkStack *S , type e)

{

    LinkStactPtr p;    // 创建结点p

    if(StackEmpty (*S) )    // 判断是否为空栈

        return ERROR;

    *e=S->top->data;    // 存储要删除元素的数据

    p=S->top;    // 把要删除的结点赋给p

    S->top=S->top->next;    // top后移一位

    free(p);    // 删除结点  赋给p是为了这个操作

    S->count - - ;    // 结点个数-1

    return OK;

}

 

总结:如果栈的使用过程中元素的变化不可预料,有时很小,有时非常大,最好使用链栈。反之,如果清楚它的变化范围,用栈的顺序存储结构比较好。

 

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值