1.链栈的表示
- 链栈的存储结构与单链表的存储结构相同。由于栈是在栈顶进行删除和添加元素的,因此,将链表的首部作为栈顶是最方便的。而且没有必要像单链表那样为了操作简单而附加一个头结点。
- 在链栈中注意指针的方向是从栈顶指向栈底。
// 链栈的存储结构
typedef struct StackNode
{
int data;
struct StackNode *next;
}StackNode,*LinkStack;
2.链栈的初始化
int InitStack(LinkStack &S)
{
S=NULL; //将栈顶指针置空
return 1;
}
3.链栈进栈(在入栈前不必判断栈是否满)
- 算法步骤
- 1、为入栈元素e分配空间,用指针p指向。
- 2、将新结点数据域置为e。
- 3、将新结点插入栈顶。
- 4、修改栈顶指针为p
- 算法描述
int Push(LinkStack &S,int e)
{
//元素e入栈
StackNode *p;
p=new StackNode; // 生成新节点
p->data=e; // 将新节点数据域置为e
p->next=S; // 将新节点插入栈顶
S=p; // 修改栈顶指针
return 1; //链栈要注意指针的方向是从栈顶指向栈底的
}
4.链栈出栈
- 和顺序栈一样,链栈在出栈前也需要判断栈是否为空,不同的是,链栈在出栈后需要释放出栈元素的栈顶空间。
- 算法步骤
- 1、判断栈是否为空,若空则返回 ERROR。
- 2、将栈顶元素赋给e。
- 3、临时保存栈顶元素的空间,以备释放。
- 4、修改栈顶指针,指向新的栈顶元素。
- 5、释放原栈顶元素的空间。
- 算法描述
int Pop(LinkStack &S,int &e)
{
if(S==NULL)
{
return 0; // 栈空
}
e=S->data; //将栈顶元素赋值给e
StackNode *p;
p=S; // 临时保存栈顶元素空间,准备释放
S=S->next; // 修改栈顶指针
delete p; // 释放原栈顶元素空间
return 1;
}
5.取栈顶元素
- 与顺序栈一样,当栈非空时,此操作返回当前栈顶元素的值,栈顶指针S保持不变。
int GetTop(LinkStack S)
{
//返回S的栈顶元素,不修改栈顶指针
if(S!=NULL) // 栈非空
return s->data; // 返回栈顶元素的值,栈顶指针不变
}
6.代码实现
- main.cpp
#include <iostream>
using namespace std;
// 链栈的存储结构
typedef struct StackNode
{
int data;
struct StackNode *next;
}StackNode, *LinkStack;
// 初始化
int InitStack(LinkStack &S)
{
S = NULL; // 将栈顶指针置空
return 1;
}
// 入栈
int Push(LinkStack &S, int e)
{
//元素e入栈
StackNode *p;
p = new StackNode; // 生成新节点
p->data = e; // 将新节点数据域置为e
p->next = S; // 将新节点插入栈顶
S = p; // 修改栈顶指针
return 1; // 链栈要注意指针的方向是从栈顶指向栈底的
}
// 出栈
int Pop(LinkStack &S, int &e)
{
if (S == NULL)
{
return 0; // 栈空
}
e = S->data; //将栈顶元素赋值给e
StackNode *p;
p = S; // 临时保存栈顶元素空间,准备释放
S = S->next; // 修改栈顶指针
delete p; // 释放原栈顶元素空间
return 1;
}
// 取栈顶元素
int GetTop(LinkStack S)
{
//返回S的栈顶元素,不修改栈顶指针
if (S != NULL) // 栈非空
return S->data; // 返回栈顶元素的值,栈顶指针不变
}
void TraveStack(LinkStack S)
{
StackNode *p;
p = S;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkStack S;
if (InitStack(S))
{
printf("链栈初始化成功!\n");
}
else
{
printf("链栈初始化失败!\n");
}
// 入栈
int n;
printf("请输入栈的元素个数:");
scanf("%d",&n);
for (int i = 0; i < n;)
{
int e;
printf("请输入第%d个入栈的元素:",++i);
scanf("%d", &e);
Push(S, e);
}
printf("遍历栈:\n");
TraveStack(S);
// 出栈(取出两个元素)
for (int i = 0; i < 2;)
{
int a;
Pop(S, a);
printf("第%d个出栈的元素:%d\n", ++i, a);
}
printf("遍历栈:\n");
TraveStack(S);
printf("栈顶元素是:%d\n", GetTop(S));
system("pause");
return 0;
}
- 运行结果