1、链栈
采用链式存储结构实现的栈,与单链表相同,区别在于链栈只在链表头进行操作。(无头结点)
在应用程序无法预先估计栈最大容量时,应该使用链栈。
链表的头指针就是栈顶
不需要头结点
基本不存在栈满的情况空栈相当于头指针指向空
插入和删除仅在栈顶处执行
2、链栈存储结构
typedef struct StackNode {
SElemType data;
struct StackNode *next;
} StackNode, *LinkStack;
3、链栈初始化
*注意,链栈无头结点
Status InitStack(LinkStack &s) // 构造一个空栈 S,栈顶指针置空
{
s = NULL;
return OK;
}
4、判断空栈
bool StackEmpty(LinkStack s)
{
if(s==NULL) return 1;
return 0;
}
5、输出链栈
void PrintStack(LinkStack s)
{
for(LinkStack p = s; p; p = p->next) {
cout << p->data;
if(p->next)
cout << ' ';
}
cout << endl;
}
6、销毁栈
void DestroyStack(LinkStack &s)
{
LinkStack next;
while(s){
next = s->next;
delete s;
s = next;
}
}
7、入栈
1、为入栈元素e分配空间,用指针p指向,将新节点数据域置为e。
2、将新节点插入栈顶。
3、修改栈顶指针为p。
Status Push(LinkStack &s, SElemType e) //在栈顶插入元素e
{
LinkStack p;
p =new StackNode;
p->data = e;
p->next = s;
s=p;
return OK;
}
8、出栈
1、判断栈是否为空,若空则返回ERROR。
2、将栈顶元素赋给e。临时保存栈顶元素的空间,以备释放。
3、修改栈顶指针,指向新的栈顶元素。
4、释放原栈顶元素的空间。
Status Pop(LinkStack &s, SElemType &e) //删除S的栈顶元素,用e返回其值
{
if (s==NULL) return ERROR;
e=s->data;
LinkStack p;
p = new StackNode;
p = s;
s = s->next;
delete p;
return OK;
}
9、取栈顶元素
SElemType GetTop(LinkStack s) //返回S的栈顶元素,不修改栈顶指针
{
if (s!=NULL) return s->data;
}