首页 > 其他分享 >链栈的实现方式

链栈的实现方式

时间:2024-07-19 17:53:01浏览次数:6  
标签:LinkStack 方式 实现 top LinkElementType 链栈 LS StackNode

链栈栈的实现方式

代码结构图

image

LinkElement.h


#ifndef LINKSTACK_H
#define LINKSTACK_H

#include <stdbool.h>

//定义数据类型
typedef int LinkElementType;

/** 定义链栈的结点结构*/
typedef struct StackNode {
    LinkElementType data;  //结点中保存的元素
    struct StackNode *next; //指向下个结点的指针
} StackNode;

/** 链栈结构*/
typedef struct LinkStack {
    StackNode * top; //栈顶指针
    int length;  //链栈的长度(元素个数)
} LinkStack;


//初始化链栈
void InitStack(LinkStack *LS);

//判断链栈是否为空
bool EmptyLinkStack(LinkStack *LS);

//进栈
bool PushLinkStack(LinkStack *LS, LinkElementType element);

//出栈
bool PopLinkStack(LinkStack *LS, LinkElementType *element);

//获取栈顶元素
LinkElementType GetLinkTop(LinkStack *LS);

//清空栈
void ClearLinkStack(LinkStack *LS);

//销毁栈
void DestroyLinkStack(LinkStack *LS);

LinkStack.c


#include "LinkStack.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

//初始化链栈
void InitStack(LinkStack *LS) {
  LS->top = NULL;
  LS->length = 0;
}

//判断链栈是否为空
bool EmptyLinkStack(LinkStack *LS) {
  return LS->length == 0;
}

//进栈
bool PushLinkStack(LinkStack *LS, LinkElementType element) {
  StackNode *node = (StackNode *)malloc(sizeof(StackNode));
  node->data = element;
  node->next = LS->top;

  LS->top = node;
  LS->length ++;
  return true;
}

//出栈
bool PopLinkStack(LinkStack *LS, LinkElementType *element) {
  if(EmptyLinkStack(LS)) {
    printf("空栈,出栈操作失败!\n");
    return false;
  }

  //获取栈顶元素
  *element = LS->top->data;
  //记录出栈操作前的栈顶指针
  StackNode *node = LS->top;
  //栈顶指针下移一位
  LS->top = LS->top->next;
  //释放原栈顶空间
  free(node);
  LS->length--;
  return true;
}

//获取栈顶元素
LinkElementType GetLinkTop(LinkStack *LS) {
  if(EmptyLinkStack(LS)) {
    printf("空栈,获取栈顶元素失败!\n");
    return -1;
  }
  return LS->top->data;
}

//清空栈
void ClearLinkStack(LinkStack *LS) {
  StackNode * tempNode;
  while (LS->top) {
    tempNode = LS->top;
    //栈顶指向下个元素
    LS->top = LS->top->next;
    free(tempNode);
    LS->length--;
  }
}

//销毁栈
void DestroyLinkStack(LinkStack *LS) {
  ClearLinkStack(LS);
  free(LS);
  LS = NULL;
}

main.c

    LinkStack S;
    InitStack(&S);

    LinkElementType a[5]={2,4,6,8,10};
    for (int i=0;i<5;i++) {
        PushLinkStack(&S,a[i]);
    }
    printf("栈顶元素:%d\n", GetLinkTop(&S));

    LinkElementType e;
    PopLinkStack(&S, &e);
    printf("出栈元素:%d\n", e);

    printf("全部元素出栈:\n");
    while(!EmptyLinkStack(&S)){
        printf("%d ", GetLinkTop(&S));
        PopLinkStack(&S, &e);
    }

运行效果图

image

标签:LinkStack,方式,实现,top,LinkElementType,链栈,LS,StackNode
From: https://www.cnblogs.com/mingcore/p/18312026

相关文章

  • Simple WPF: S3实现MINIO大文件上传并显示上传进度
    SimpleWPF:S3实现MINIO大文件上传并显示上传进度 合集-SimpleWPF(9) 1.SimpleWPF:WPF透明窗体和鼠标事件穿透07-012.SimpleWPF:WPF自定义按钮外形07-073.SimpleWPF:WPF实现按钮的长按,短按功能07-084.SimpleWPF:WPF自定义一个可以定义步长的SpinBox07-095.Si......
  • 在Spring Boot中实现日志管理与监控
    在SpringBoot中实现日志管理与监控大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨如何在SpringBoot应用程序中实现日志管理与监控。日志管理和监控是现代应用程序的核心部分,它们有助于跟踪应用程序的运行状态、诊断问题并提高系统的可维......
  • 使用Java和Redis实现分布式缓存系统
    使用Java和Redis实现分布式缓存系统大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨如何使用Java和Redis实现一个高效的分布式缓存系统。Redis是一个开源的内存数据结构存储系统,广泛用于缓存和分布式数据库中。在本文中,我们将展示如何使用Ja......
  • Geostudio简单实现边坡安全系数的计算
    Geostudio是加拿大团队开发的用于岩土工程稳定性分析的一款工程软件,里面的安全系数的计算基本都是基于极限平衡法原理进行求解的,SLOPE/W模块用于安全系数的求解。SEEP/W模块考虑渗水作用。QUAKE/W模块考虑地震因素。其余模块不常用。今天教大家如何对简易边坡进行一个简单的求......
  • [附开题]flask框架的基于web的线上考试管理系统的设计与实现n1qn5(python+源码)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,教育领域正经历着深刻的变革。传统的线下考试模式逐渐显露出其局限性,如组织成本高、效率低下、资源分配不均等问......
  • CSS实现点击翻转效果
    1、先看效果就是点击之后反转成蓝色的过程,不知道用什么软件能录制个gif(如果你有什么好的录制gif软件可以告诉我,哈哈),就将就着看吧。上代码,html版本<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-wi......
  • verilog实现ram16*8 (vivado)
    moduleram_16x2(inputclk,//时钟信号inputwe,//写使能inputen,//使能信号input[3:0]addr,//地址线input[1:0]datain,//输入数据线outputreg[1:0]dataout//输出数据线);//定义存储器数组......
  • PHP编程中的接口与性状:实现代码解耦与功能复用的关键技术
    本文由ChatMoney团队出品在PHP编程中,接口是一种定义对象之间交互契约的强大工具。其核心目的不是让一个对象紧耦合地依赖另一个对象的特定身份,而是基于另一对象的能力进行交互。通过接口,我们的代码可以实现与依赖的解耦,从而允许我们的代码与任何实现了相应接口的第三方代码协......
  • C++ 智能指针简单实现
    #pragmaoncetemplate<typenameTR>classjoker_shared_ptr{private:TR*ptr;size_t*count;public:constexprjoker_shared_ptr(/*args*/)noexcept{}constexprjoker_shared_ptr(std::nullptr_t)noexcept{}explicitjoker_sha......
  • C语言实现全局变量定义的实验
    constant.h文件内容:staticconstchartest_static_variable='a'; function_module.c文件内容:#ifndef__STDIO_H#define__STDIO_H#include<stdio.h>#endif#ifndef__CONSTANT_H#define__CONSTANT_H#include&quo......