链栈存储结构和基本运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链栈存储结构和基本运算相关的知识,希望对你有一定的参考价值。

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

 

以上是关于链栈存储结构和基本运算的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记——链式存储结构实现栈(链栈)

数据结构学习笔记——链式存储结构实现栈

顺序栈链栈双端栈

数据结构栈的链式存储结构

(王道408考研数据结构)第三章栈和队列-第二节:队列基本概念顺序栈和链栈基本操作

数据结构0404