链栈存储结构和基本运算
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); }
以上是关于链栈存储结构和基本运算的主要内容,如果未能解决你的问题,请参考以下文章