链栈是基于单链表实现的栈,其中需要注意的点是单链表的末尾是栈底,单链表的表头是栈顶。因为在出栈是要找到下一个元素,正好可以利用上单链表中的next指针,所以栈顶是链表表头位置,栈底是链尾。
1:定义
typedef struct StackNode
{
int data;
struct StackNode* next;
}StackNode,*LinkStack;
有着数据域和next域,虽然是栈,但是采用链表来实现。
2:初始化
void InitStack(LinkStack& s)
{
s = NULL;
}
直接将这个链栈赋值为空即可,因为是引用,所以可以直接对本体进行操作,直接将定义出来的栈赋值空。
3:入栈
void Push(LinkStack& s, int x)
{
StackNode* tmp = new StackNode;
tmp->data = x;
tmp->next =s;
s = tmp;
}
既然要入栈,就需要先创建一个新的链栈空间并进行赋值,再按照单链表中的头插法插入链栈中。
4:出栈
void Pop(LinkStack& s)
{
if (s == NULL)return;
StackNode* cur = s->next;
delete s;
s = cur;
}
为空直接返回即可,不为空记录下下一个位置后删除现位置,然后再将cur赋给s。
5:得到栈顶元素
int Get(LinkStack& s)
{
if (s != NULL)
return s->data;
}
返回s->data即可 (这里与顺序表栈有不同,这里的栈顶指针一直是指向栈顶元素的,而不是指向栈顶元素的下一个位置)
6:判断是否为空
bool Empty(LinkStack& s)
{
if (s)return true;//不空就返回1
else return false;
}
7:输出
while (Empty(l))
{
cout << Get(l)<< " ";
Pop(l);
}
与上篇的顺序栈一致,通过函数来实现。
下面是全代码
#include<iostream>
using namespace std;
typedef struct StackNode
{
int data;
struct StackNode* next;
}StackNode,*LinkStack;
void InitStack(LinkStack& s)
{
s = NULL;
}
void Push(LinkStack& s, int x)
{
StackNode* tmp = new StackNode;
tmp->data = x;
tmp->next =s;
s = tmp;
}
void Pop(LinkStack& s)
{
if (s == NULL)return;
StackNode* cur = s->next;
delete s;
s = cur;
}
int Get(LinkStack& s)
{
if (s != NULL)
return s->data;
}
bool Empty(LinkStack& s)
{
if (s)return true;//不空就返回1
else return false;
}
int main()
{
LinkStack l;
InitStack(l);
Push(l, 1);
Push(l, 2);
Push(l, 3);
Push(l, 4);
Push(l, 5);
while (Empty(l))
{
cout << Get(l)<< " ";
Pop(l);
}
return 0;
}
下面是输出结果
![](https://i-blog.csdnimg.cn/blog_migrate/5d61f75b972c3052975fc6726dee4767.png)