链栈存储结构和基本运算

1.链栈的优点:不存在栈满上溢出的情况,给定链栈之后,已知头结点地址,在之后插入和删除操作时间复杂度均为O(1)

2.基本运算的代码实现

  1)结点类型的声明

typedef struct linknode{
    ElemType data;
    struct linknode *next;
}LinkStNode;    //链栈的结点类型

这样定义之后,有几个特性要注意咯

  a)栈空的条件S.next=NULL

  b)元素e的出栈操作:新建一个结点存放元素e,然后用一个指针p指向它,将结点p插入到头结点之后

2)初始化链栈InitStack(LinkStNode &s)

void InitStack(LinkStNode &s){
    s= (LinkStNode *)malloc(sizeof(LinkStNode));
    s->next = NULL;
}

3)进栈Push(LinkStStack&s,ElemType e)

void Push(LinkStNode &s,ElemType e){
    LinkStNode *p;
    p=(LinkStNode *)malloc(sizeof(LinkStNode)); //新建结点
    p->data = e;
    p->next =s->next;       //将结点p插入到头结点之后
    s->next = p;
}

这个链式头结点和前面的概念有点不一样啊!!

每次插入元素都放在头结点之后,然后头结点就是栈顶~

4)出栈Pop(LinkStNode &s,ElemType &e)

void Pop(LinkStNode &s,ElemType &e){
    LinkStNode *p;
    if(s->next == NULL)
        return 0;
    p = s->next;
    e= p->data;     //提取数据
    s->next = p->next;
    free(p);    //释放被删结点的存储空间
    return 1;
}

嗯这个算法,就是首先用p指向要删除的那一个结点,然后!!!一定记得把数据存到e中再释放结点啥的!

5)取栈顶元素getTop(LinkStNode &s,ElemType &e)

void GetTop(LinkStNode &s,ElemType &e){
    if(s->next == NULL)
        return 0;
    e = s->next->data;
    return 1;
}

要注意:链式栈里不用判断栈满的情况,但是删除和取栈顶元素的时候还是要判断有没有元素在栈里面啊!!

6)判断栈是否为空StackEmpty(LinkStNode *s)

bool StackEmpty(LinkStNode *s){
    return (s->next== NULL);
}

 

posted on 2017-10-20 18:11  中二病重度 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/zhangxiran/p/7700896.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值