目录
(一)链栈图文解析
链栈是指采用链式结构实现的栈,和单链表的存储结构相同,用数据域和指针域分别代表存储的数据与指针,与单链表不同的是栈不需要头结点,且只对栈顶元素依次进行入栈和出栈操作。
(二) 顺序栈代码解析
(1) 链栈的基本操作
1.1 链栈的存储结构
typedef struct StackNode
{
int data; //数据域
struct StackNode *next; //指针域
}StackNode,*LinkStack;
1.2 链栈的初始化
void InitStack(LinkStack &S)
{
S=NULL;//因为链栈不需要头结点,所以也不必为其分配空间
}
1.3 链栈的入栈
void Push(LinkStack &S,int e)
{
LinkStack p; //创建一个新结点
p=(StackNode *)malloc(sizeof(StackNode));//为结点分配空间
p->data=e; //给新结点p的数据域置为e
p->next=S; //将新结点插入到栈顶,新结点p指向栈顶S结点
S=p; //使栈顶S结点=p结点,即使S依旧指向栈顶p
}
1.4 链栈的出栈
void Pop(LinkStack &S,int &e)
{
LinkStack p;//创建一个新结点
p=(StackNode *)malloc(sizeof(StackNode));//为新结点分配空间
if(S==NULL) //判断链栈是否为空
printf("栈空!\n");
else
{
e=S->data;//将栈顶数据赋给e
p=S; //用p保存栈顶结点S,用于释放栈顶结点
S=S->next; //修改栈顶指针,使S指向栈顶以下的结点
free(p); //释放头结点的空间p=S
}
}
1.5 取栈顶元素
void GetTop(LinkStack S)
{
if(S!=NULL)
printf("栈顶元素:%d\n",S->data);
else
printf("栈空!\n");
}
(2) 链栈源代码及测试
2.1 源代码:
#include<stdio.h>
#include<malloc.h>
typedef struct StackNode
{
int data;
struct StackNode *next;
}StackNode,*LinkStack;
void InitStack(LinkStack &S)
{
S=NULL;
}
void Push(LinkStack &S,int e)
{
LinkStack p;
p=(StackNode *)malloc(sizeof(StackNode));
p->data=e;
p->next=S;
S=p;
}
void Pop(LinkStack &S,int &e)
{
LinkStack p;
p=(StackNode *)malloc(sizeof(StackNode));
if(S==NULL)
printf("栈空!\n");
else
{
e=S->data;
p=S;
S=S->next;
free(p);
}
}
void GetTop(LinkStack S)
{
if(S!=NULL)
printf("栈顶元素:%d\n",S->data);
else
printf("栈空!\n");
}
int main()
{
StackNode *S;
int e;
InitStack(S);
Push(S,10);
Push(S,20);
Push(S,30);
printf("依次入栈10,20,30\n");
GetTop(S);
printf("出栈一次\n");
Pop(S,e);
GetTop(S);
return 0;
}
2.2 测试结果:
测试环境 : Windows 10
编译软件 : Visual C++ 6.0