数据结构学习笔记——栈链
前言
栈是一种先入后出的数据结构,本文利用链表来模拟栈,并给出了栈的几种方法实现。
一、栈头文件
声明栈元素数据类型为整型:
typedef int ElemType;
1.定义栈节点,包括数据域和指针域,数据域存储数据,指针域存储下一节点的地址。
typedef struct StackNode
{
ElemType data;
struct StackNode *next;
}StackNode;
2.定义一个栈管理结构体,存储栈的大小和栈的头指针。
typedef struct Stack
{
StackNode *head;
int stacksize;
}Stack;
3.给出一系列栈的方法,包括栈的初始化、入栈、出栈、栈判空、栈遍历、栈大小、栈清空等。
void InitStack(Stack *st);
void Push(Stack *st,ElemType item);
ElemType Pop(Stack *st);
bool StackEmpty(Stack *st);
void StackShow(Stack *st);
int StackLength(Stack *st);
void StackClear(Stack *st);
二、栈源文件
主函数中声明一个新栈:
Stack mystack;
注:变量声明后编译器即为其开辟相应大小空间(局部变量存储在内存栈区),但变量值随机,需要进行初始化(主要该结构体中有指针变量,初始化能避免野指针)。
1.初始化
功能:初始化栈头指针为空,栈大小为0。
要点:涉及到变量值改变的函数要传递地址。
void InitStack(Stack *st)
{
st->head = NULL;
st->stacksize = 0;
}
2.入栈
功能:用malloc函数在内存堆区申请一个节点大小的空间,用头插法插入节点,并相应更新栈大小。
要点:使用malloc方法后要判断内存空间是否申请成功;
判断插入的是否是第一个节点;
指针域的更新顺序。
void Push(Stack *st,ElemType item)
{
StackNode *s = (StackNode*)malloc(sizeof(StackNode));
if(!s) exit(OVERFLOW);
s->data = item;
s->next = NULL;
if(st->head==NULL) st->head=s;
else
{
s->next = st->head;
st->head = s;
}
st->stacksize++;
}
3.出栈
功能:返回栈顶元素并释放栈顶节点,并相应更新栈大小。
要点:判断栈是否为空;
指针域更新和节点释放顺序;
free方法释放了malloc等方法在内存堆区申请的空间。
ElemType Pop(Stack *st)
{
StackNode *p = st->head;
if(StackEmpty(st))
{
printf("栈为空\n");
return NULL;
}
ElemType temp = p->data;
st->head = p->next;
free(p);
st->stacksize--;
return temp;
}
4.栈判空
功能:根据栈管理中存储的栈大小返回布尔值。
bool StackEmpty(Stack *st)
{
return st->stacksize==0;
}
5.栈遍历
功能:利用循环从头节点访问至尾节点。
要点:判断栈是否为空;
循环结束条件为访问完所有节点;
p指针的更新。
void StackShow(Stack *st)
{
if(StackEmpty(st))
{
printf("栈为空\n");
return;
}
StackNode *p = st->head;
while(p!=NULL)
{
printf("%d\n",p->data);
p = p->next;
}
}
6.栈大小
功能:返回栈管理中存储的栈大小。
int StackLength(Stack *st)
{
return st->stacksize;
}
7.栈清空
功能:利用循环释放所有在堆区申请的节点空间,即清空整个栈。
要点:判断栈是否为空;
头指针、p指针的更新和节点释放的顺序;
栈大小要清0。
特别注意:存储在内存栈区的栈管理结构体无法被free方法释放。
void StackClear(Stack *st)
{
if(StackEmpty(st)) return;
while(st->head!=NULL)
{
StackNode *p = st->head;
st->head = p->next;
free(p);
}
st->stacksize = 0;
}
总结
数据结构学习——栈及栈方法