单链堆栈:使用链式存储堆栈。链堆栈的优点是没有堆栈溢出(一般不考虑,只有内存溢出时才会发生堆栈溢出)。
规定栈的所有操作都是在单链表的表头进行,第一个数据节点是栈顶节点,最后一个节点是栈底节点。
2 链栈的各种算法如下:
链栈的基本算法一
(1)初始化栈InitStack(s):建立一个新的空栈s,实际上创建链栈的头节点,并将其next域置为NULL
void InitStack(LiStack * &s){
s = (LiStack *)malloc(sizeof(LiStack));
s -> next = NULL;
}
(2)销毁栈,DestroyStack(s):释放栈s占用的存储空间
void DestroyStack(LiStack * &s){
LiStack * p = s, * q = s -> next;
while(q != NULL){
free(p);
p = q;
q = p -> next;
}
free(p); // 此时p指向尾节点,释放其空间
}
(3) 判断栈是否为空StackEmpty(s):栈s为空的条件是s -> next == NULL
bool StackEmpty(LiStack *s){
return (s -> next == NULL);
}
链栈的基本算法二
(4) 进栈Push(s,e):将新数据节点插入到头节点之后
void Push(LiStack * &s,ElemType e){
LiStack * p;
p = (LiStack *)malloc(sizeof(LiStack));
p -> data = e; // 新建元素e对应的节点 *p
p -> next = s -> next; // 插入*p节点作为开始节点
s -> data[s -> top] = e; // 元素e放在栈顶指针处
s -> next = p;
}
(5) 出栈Pop(s,e):在栈不为空的条件下,将头节点的指针域所指数据节点的数据域赋给e,然后将该数据节点删除
bool Pop(LiStack * &s,ElemType &e){
LiStack * p;
if(s -> next == NULL) // 栈为空的情况
return false;
p = s-> next; // p指向开始节点
e = p -> data;
s -> next = p -> next; // 删除*p节点
free(p); // 释放*p节点
return true;
}
(6)取栈顶元素GetTop(s,e):在栈不空的情况下,将头节点的指针域所指数据节点的数据域赋给e
bool GetTop(LiStack * &s,ElemType &e){
if(s -> next == NULL) // 栈为空的情况
return false;
e = s-> next -> data; // 取栈顶元素
return true;
}
1.文章《链栈如何判断栈满链栈为什么不需要判断栈满!》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《链栈如何判断栈满链栈为什么不需要判断栈满!》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好