提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
1.只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底。
2. 栈特点:
先进后出“FILO” first in last out
一、链式栈是什么?
- 链式栈是基于单链表的存储表示实现的栈。
- 链式栈的栈顶在链表的表头,因此,新结点的插入和栈顶结点的删除都在链表的表头(即栈顶)进行。
二、使用步骤
1.建立一个空的栈并入栈
代码如下(示例):
void CreateEpLinkStack(linkstack_t **ptop)
{
*ptop = NULL;
}
int PushLinkStack(linkstack_t **ptop, datatype data)
{
linkstack_t *pnew = (linkstack_t *)malloc(sizeof(linkstack_t));
if (NULL == pnew)
{
printf("PushLinkStack malloc error\n");
return -1;
}
//新节点初始化
pnew->data = data;
pnew->next = NULL;
//新节点放到栈顶位置
pnew->next = *ptop;
*ptop = pnew; //top要始终指向栈顶
return 0;
}
2.判断栈是否为空
代码如下(示例):
int IsEpLinkStack(linkstack_t *top)
{
return top == NULL;
}
3.出栈
datatype PopLinkStack(linkstack_t **ptop)
{
if (IsEpLinkStack(*ptop))
{
printf("PopLinkStack error\n");
return -1;
}
datatype temp;
linkstack_t *pdel = NULL; //定义一个指针目的是指向栈顶
pdel = *ptop; //指向栈顶
*ptop = pdel->next; //因为top始终指向栈顶,所以*ptop要后移一个单位。实现持续指向栈顶
temp = pdel->data; //用temp来标记要出栈的数据
free(pdel);
pdel = NULL;
return temp;
}
4.清空栈
void ClearLinkStack(linkstack_t **ptop)
{
while (! IsEpLinkStack(*ptop))
{
PopLinkStack(ptop);//引用出栈函数挨个释放
}
}
5.求栈的长度
int LengthLinkStack(linkstack_t *top)//因为只是求长度所以用一维指针即可
{
int len=0;
while(top !=NULL)
{
len ++;
top=top->next;//从栈顶到栈底走一遍
}
return len;//返回值len即为该长度
}
6.获取栈顶数据
datatype GetTopLinkStack(linkstack_t *top)
{
if(!IsEpLinkStack(top))
{
return top->data;
}
return -1;
}
7.主函数
#include"linkstack.h"
int main()
{
linkstack_t *top;
CreateEpLinkStack(&top);
int i;
for(i=0;i<5;i++)
{
PushLinkStack(&top,i);
}
#if 0
for(i=0;i<5;i++)
{
printf("%d\n",PopLinkStack(&top));
}
#endif
printf("len: %d\n",LengthLinkStack(top));
printf("top_data:%d\n",GetTopLinkStack(top));
#if 0
ClearLinkStack(&top);
#endif
return 0;
}
.h文件:
#ifndef _LINKSTACK_H
#define _LINKSTACK_H
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct linkstack
{
datatype data;
struct linkstack *next;
}linkstack_t;
void CreateEpLinkStack(linkstack_t **ptop);
int PushLinkStack(linkstack_t **ptop,datatype data);
int IsEpLinkStack(linkstack_t *top);
datatype PopLinkStack(linkstack_t **ptop);
void ClearLinkStack(linkstack_t **ptop);
int LengthLinkStack(linkstack_t *top);
datatype GetTopLinkStack(linkstack_t *top);
#endif
总结
顺序栈和链式栈的区别是什么?
(1)存储结构不同,顺序栈相当于数组,连续的,链式栈 链表非连续的
(2)顺序栈的长度受限制,而链栈不会