链栈

目录

简述

基本操作

结构体构造

初始化

判空

入栈

出栈

查询栈顶元素

完整程序

运行结果

文章声明


 

简述

链栈是以链式的存储方式存储的线性表, 是栈这一数据结构存储方式的一种。本质是一种只能在一端(即栈顶)进行增,删操作的单链表。

下面我们来详细探讨链栈的基本操作。本文讨论的是无头结点的链栈。

基本操作

结构体构造

typedef struct LinkStackNode{
    int data;
    LinkStackNode *next;
}LSNode,*LinkStack;

在这段代码中我们定义了名为struct LinkStackNode的结构体, 并使用typedef将其重命名为LSNode和LinkSatck。虽然两者表示的都是统一结构体,但其表示的含义不同。LSNode表示一个节点,而LinkStack则用于表示整个链栈,这样便于在程序中区分。

初始化

void initLinkStack(LinkStack &LS){
    LS = NULL;
}

将初始链栈的指针指向NULL

判空

bool empty(LinkStack LS){
    if(LS == NULL)
        return true;
    return false;
}

由于不需要对链栈进行改动,故而无需传入引用

入栈

bool push(LinkStack &LS, int e){
    //创建新的节点
    LSNode *p = (LSNode*) malloc(sizeof (LSNode));
    //分配空间失败, 返回false
    if(p == NULL)
        return false;
    //为节点赋值
    p->data = e;
    //将节点入栈
    p->next = LS;
    LS = p;
    return true;
}

出栈

bool pop(LinkStack &LS, int &x){
    //如果是空栈, 则不能出栈
    if(LS == NULL)
        return false;
    //临时节点, 用于记录栈顶节点地址, 便于回收
    LSNode *s = LS;
    //记录当前栈顶节点元素
    x = LS->data;
    //更改栈顶节点
    LS = LS->next;
    //回收先前栈顶节点
    free(s);
    return true;
}

此处的判空操作也可以直接调用empty函数

查询栈顶元素

int getTop(LinkStack LS){
    //判断是否是空栈
    if(empty(LS))
        return NULL;
    
    return LS->data;
}

完整程序

#include "cstdio"
#include "cstdlib"
//不带头结点的链栈
typedef struct LinkStackNode{
    int data;
    LinkStackNode *next;
}LSNode,*LinkStack;

void initLinkStack(LinkStack &LS);
bool empty(LinkStack LS);
bool push(LinkStack &LS, int e);
bool pop(LinkStack &LS, int &x);
void printLinkStack(LinkStack LS);
int getTop(LinkStack LS);

int main(){
    LinkStack LS;
    initLinkStack(LS);

    //接收键入数据
    int x;
    scanf("%d",&x);

    //此处-1为输入结束标志,可任意设定
    while(x != -1){
        push(LS,x);
        scanf("%d",&x);
    }
    printf("原始链栈为: ");
    printLinkStack(LS);
    printf("栈顶元素为: %d\n", getTop(LS));

    //接收出栈元素
    int e;

    pop(LS,e);
    printf("出栈元素为: %d\n",e);
    printf("出栈后链栈为: ");
    printLinkStack(LS);
    printf("栈顶元素为: %d", getTop(LS));
    return 0;
}

//初始化链栈
void initLinkStack(LinkStack &LS){
    LS = NULL;
}

//判空
bool empty(LinkStack LS){
    if(LS == NULL)
        return true;
    return false;
}

//入栈
bool push(LinkStack &LS, int e){
    //创建新的节点
    LSNode *p = (LSNode*) malloc(sizeof (LSNode));
    //分配空间失败, 返回false
    if(p == NULL)
        return false;
    //为节点赋值
    p->data = e;
    //将节点入栈
    p->next = LS;
    LS = p;
    return true;
}

//出栈
bool pop(LinkStack &LS, int &x){
    //如果是空栈, 则不能出栈
    if(LS == NULL)
        return false;
    //临时节点, 用于记录栈顶节点地址, 便于回收
    LSNode *s = LS;
    //记录当前栈顶节点元素
    x = LS->data;
    //更改栈顶节点
    LS = LS->next;
    //回收先前栈顶节点
    free(s);
    return true;
}

//查询栈顶元素
int getTop(LinkStack LS){
    //判断是否是空栈
    if(empty(LS))
        return NULL;

    return LS->data;
}

//打印链栈
void printLinkStack(LinkStack LS){
    //构建扫描器
    LSNode *p = LS;
    //遍历链栈, 并从栈顶开始打印链栈元素
    while(p != NULL){
        printf("%d ",p->data);
        p = p->next;
    }
    //换行
    printf("\n");
}

运行结果

421e4022ac32401788e680001e7ed6ee.png

文章声明

本文仅为个人学习总结,不做商业用途,在声明来源的前提下欢迎转载学习,如有不足之处敬请指正。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值