【数据结构】栈的链式实现和操作(创建栈,入栈,出栈,获取栈顶元素)

栈是一种重要的数据结构,符合“后进先出”(FILO)的原则。就像向箱子里堆东西一样,后放入的元素需要被先取出来。这篇文章,我将介绍链式栈的创建和基本操作。


①链式栈的实现需要两个结构体:Stack和Node。

(1)Node结构体即为链表的结点,存放data和next指针。Node结构体用来存放数据并组成栈,入栈和出栈都需要借助Node结构体。
(2)Stack结构体即为“栈”的实体,存放栈容量size和top指针。由于这个栈已经借助Node创建好了,我们只需要通过top指针就可以操作栈了。所以top指针就相当于表征了整个栈,存放top指针的结构体我们就视之为“栈”。

struct Node
{
    elemtype data;
    struct Node* next;
};

struct Stack       //结构体Stack存储栈的基本元素:top指针和栈大小size
{
    struct Node* top;   //栈顶top指针
    size_t size;        //栈容量 
};

②创建结点Node和栈Stack。

(1)传入data并创建单个结点,即为简单的动态内存分配,不做赘述。
(2)创建栈Stack就是创建包含top指针的结构体,也要为其分配空间,同时实现初始化。

typedef Node* PNode;
typedef Stack* PStack;

PNode Create_Node(elemtype x)   //创建结点,传入data,返回指向这个节点的指针
{
    PNode newnode=(PNode)malloc(sizeof(Node));
    newnode->next=NULL;
    newnode->data=x;

    return newnode;
}

PStack Create_Stack()   //创建栈,即创建一个Stack变量,创建即初始化
{
    PStack newstack=(PStack)malloc(sizeof(Stack));  
    newstack->top=NULL;
    newstack->size=0;

    return newstack;
};

③入栈和出栈。

(1)链式栈的入栈操作:实质上是链表的头插法。首先,我们需要创建出即将插入的结点Node并赋好data的值,这个过程我们已经定义过函数Create_Node(x)了。然后,我们通过top指针的指引将新节点Node插入链表的头部。最后,top指针移位指向栈顶,栈容量size自增。

(2)链式栈的出栈操作:即top指针向后移位,原栈顶元素的空间被释放,栈容量size自减。出栈时需要注意到栈是否为空,如果空栈则不能再出栈。

*这个过程可以表示为下图:
在这里插入图片描述

*代码实现:

void Push(elemtype x,PStack L)   //入栈:即链表的头插法
{
    PNode newnode=Create_Node(x);   //创建将要插入的结点
    /*头插*/
    newnode->next=L->top;   
    L->top=newnode;
    L->size++;
}

void Pop(PStack L)      //出栈
{
    if (L->size == 0)
    {
        printf("NULL!Pop Error......\n");
        exit(0);
    }
    else 
    {
        PNode nextnode=L->top->next;
        free(L->top);
        L->top=nextnode;
        L->size--;
    }
}

④获取栈顶元素。

即return (L->top->data),通过top指针获取结点Node,在获取data。

elemtype Gettop(PStack L)   //获取当前栈顶元素
{
    return (L->top->data);
}

完整代码如下:

#ifndef _LWCStack_H_
#define _LWCStack_H_

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

typedef char elemtype;
typedef struct Node* PNode;
typedef struct Stack* PStack;
typedef struct Node Node;
typedef struct Stack Stack;
 
struct Node
{
    elemtype data;
    struct Node* next;
};

struct Stack       //结构体Stack存储栈的基本元素:top指针和栈大小size
{
    struct Node* top;   //栈顶top指针
    size_t size;        //栈容量 
};

PNode Create_Node(elemtype x)   //创建结点,传入data,返回指向这个节点的指针
{
    PNode newnode=(PNode)malloc(sizeof(Node));
    newnode->next=NULL;
    newnode->data=x;

    return newnode;
}

PStack Create_Stack()   //创建栈,即创建一个Stack变量,创建即初始化
{
    PStack newstack=(PStack)malloc(sizeof(Stack));  //创建栈(结构体)
    newstack->top=NULL;
    newstack->size=0;

    return newstack;
};

void Push(elemtype x,PStack L)   //入栈:即链表的头插法
{
    PNode newnode=Create_Node(x);   //创建将要插入的结点
    /*头插*/
    newnode->next=L->top;   
    L->top=newnode;
    L->size++;
}

void Pop(PStack L)      //出栈
{
    if (L->size == 0)
    {
        printf("NULL!Pop Error......\n");
        exit(0);
    }
    else 
    {
        PNode nextnode=L->top->next;
        free(L->top);
        L->top=nextnode;
        L->size--;
    }
}

elemtype Gettop(PStack L)   //获取当前栈顶元素
{
    return (L->top->data);
}

#endif
  • 19
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值