数据结构学习笔记——栈链

数据结构学习笔记——栈链


前言

栈是一种先入后出的数据结构,本文利用链表来模拟栈,并给出了栈的几种方法实现。


一、栈头文件

声明栈元素数据类型为整型:

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;
}

总结

数据结构学习——栈及栈方法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值