码迷,mamicode.com
首页 > 其他好文 > 详细

链栈存储结构和基本运算

时间:2017-10-20 20:22:16      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:pre   str   top   node   code   typedef   时间复杂度   出栈   size   

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);
}

 

链栈存储结构和基本运算

标签:pre   str   top   node   code   typedef   时间复杂度   出栈   size   

原文地址:http://www.cnblogs.com/zhangxiran/p/7700896.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!