【数据结构】 链栈的基本操作 (C语言版)

目录

一、链栈

1、链栈的定义:

2、链栈的优缺点:

二、链栈的基本操作算法(C语言)    

1、宏定义

  2、创建结构体

3、链栈的初始化 

 4、链栈的进栈

5、链栈的出栈

6、获取栈顶元素

7、栈的遍历输出

8、链栈的判空

 9、求链栈的栈长

10、链栈的清空

11、链栈的销毁

三、链栈的基本操作完整代码(C语言)

 四、运行结果


一、链栈

1、链栈的定义:

链栈是一种栈的实现方式,它使用链表结构来实现。每个节点包含数据域和指针域,其中数据域用于存储数据,指针域用于指向下一个节点。链栈的栈顶指针指向栈顶元素,栈底指针指向栈底元素。

2、链栈的优缺点:

链栈的优点:

  1. 空间利用率高:链栈可以根据实际情况动态调整栈的大小,避免了顺序栈可能出现的内存溢出等问题。
  2. 时间复杂度低:链栈的入栈和出栈操作只需要改变栈顶指针的指向,时间复杂度为O(1),不需要像顺序栈一样进行数据的移动,具有比较高的效率。
  3. 方便进行动态扩展:链栈可以方便地进行动态扩展,当需要增加元素时,可以动态地增加存储空间;当需要减少元素时,可以释放未使用的空间。

链栈的 缺点:

  1. 需要额外的指针存储空间,因此占用的存储空间较大。
  2. 插入和删除操作需要修改指针,操作较为复杂。
  3. 无法充分利用内存的连续性优势,因为链表节点的存储位置是分散的。

二、链栈的基本操作算法(C语言)    

1、宏定义
#define OK 1
#define ERROR 0
#define OVERFLOW -1typedef int SElemType;
typedef int Status;
  2、创建结构体
//创建结构体
typedef struct StackNode {SElemType data;struct StackNode *next;
} StackNode, *LinkStack;
3、链栈的初始化 
//初始化
Status InitStack(LinkStack &S) {S = NULL;return OK;
}
 4、链栈的进栈
//进栈
Status Push(LinkStack &S, SElemType e) {//在栈顶插入元素eStackNode *p = new StackNode; //生成新结点if (!p) exit(OVERFLOW);p->data = e;p->next = S; //将新结点插入  栈顶S = p;       //修改栈顶指针为preturn OK;
}
5、链栈的出栈
//出栈
Status Pop(LinkStack &S, int &e) {//删除S的栈顶元素,用e返回其值if (S == NULL) {return ERROR;}e = S->data;      //将栈顶元素赋给eLinkStack p = S;            //用p临时保存栈顶元素空间,以备释放S = S->next;      //修改栈顶指针delete p;return OK;
}
6、获取栈顶元素

//获取栈顶元素
Status Top(LinkStack &S, int &e) {//删除S的栈顶元素,用e返回其值if (S == NULL) {return ERROR;}e = S->data;      //将栈顶元素赋给ereturn OK;
}
7、栈的遍历输出
//栈的遍历输出
void StackTraverse(LinkStack S) {LinkStack p;  //使用指针p辅助访问栈里元素p = S;           //p初始从栈顶开始printf("从栈顶依次读出该栈中的元素值为:");while (p != NULL) {printf("%d ", p->data);p = p->next;}printf("\n");
}
8、链栈的判空
//判空
Status stackEmpty(LinkStack S) {if (S == NULL) {如果栈顶的指针域指向空,则栈空return true;} else {return false;}
}
 9、求链栈的栈长
//求栈长
Status stackLength(LinkStack S) {int len = 0;while (S != NULL) {len++;S = S->next;}return len;
}
10、链栈的清空
//清空
Status ClearStack(LinkStack &S) {StackNode *p;while (S != NULL) {p = S->next;delete S;S = p;}return OK;
}
11、链栈的销毁
//销毁
Status DestoryStack(LinkStack S) {StackNode *p;while (S) {p = S;S = S->next;delete p;}S = NULL;return OK;
}

三、链栈的基本操作完整代码(C语言)

#include <stdio.h>
#include <stdlib.h>#define OK 1
#define ERROR 0
#define OVERFLOW -1typedef int SElemType;
typedef int Status;//创建结构体
typedef struct StackNode {SElemType data;struct StackNode *next;
} StackNode, *LinkStack;//初始化
Status InitStack(LinkStack &S) {S = NULL;return OK;
}//进栈
Status Push(LinkStack &S, SElemType e) {//在栈顶插入元素eStackNode *p = new StackNode; //生成新结点if (!p) exit(OVERFLOW);p->data = e;p->next = S; //将新结点插入  栈顶S = p;       //修改栈顶指针为preturn OK;
}//出栈
Status Pop(LinkStack &S, int &e) {//删除S的栈顶元素,用e返回其值if (S == NULL) {return ERROR;}e = S->data;      //将栈顶元素赋给eLinkStack p = S;            //用p临时保存栈顶元素空间,以备释放S = S->next;      //修改栈顶指针delete p;return OK;
}//获取栈顶元素
Status Top(LinkStack &S, int &e) {//删除S的栈顶元素,用e返回其值if (S == NULL) {return ERROR;}e = S->data;      //将栈顶元素赋给ereturn OK;
}//获取栈顶元素
Status GetTop(LinkStack S) {//返回S的栈顶元素,不修改栈顶指针if (S != NULL) {return S->data;}
}//栈的遍历输出
void StackTraverse(LinkStack S) {LinkStack p;  //使用指针p辅助访问栈里元素p = S;           //p初始从栈顶开始printf("从栈顶依次读出该栈中的元素值为:");while (p != NULL) {printf("%d ", p->data);p = p->next;}printf("\n");
}//判空
Status stackEmpty(LinkStack S) {if (S == NULL) {如果栈顶的指针域指向空,则栈空return true;} else {return false;}
}//求栈长
Status stackLength(LinkStack S) {int len = 0;while (S != NULL) {len++;S = S->next;}return len;
}//清空
Status ClearStack(LinkStack &S) {StackNode *p;while (S != NULL) {p = S->next;delete S;S = p;}return OK;
}//销毁
Status DestoryStack(LinkStack S) {StackNode *p;while (S) {p = S;S = S->next;delete p;}S = NULL;return OK;
}//功能菜单
int choice() {printf("==================================\n");printf("         链栈操作功能菜单            \n");printf("1、进栈  2、出栈  3、获取栈顶元素 \n");printf("4、清空  5、销毁   6、批量进栈   \n");printf("7、判空           8、链栈的长度 \n");printf("9、打印栈内元素     10、退出程序 \n");printf("==================================\n");return 0;
}int main() {LinkStack linkstack;//初始化Status rInitStack = InitStack(linkstack);if (rInitStack == OK) {printf("链栈初始化成功!\n");} else {printf("链栈初始化失败!\n");}while (1) {//功能菜单choice();int flag;printf("请输入所需的功能编号:\n");scanf("%d", &flag);switch (flag) {case 1: {//进栈Status Pushdata;printf("请输入插入元素(请在英文状态下输入例如:1): \n");scanf("%d", &Pushdata);Status rPush = Push(linkstack, Pushdata);if (rPush == OK) {printf("向链栈进栈%d成功!\n", Pushdata);} else {printf("向链栈进栈失败!\n");}}break;case 2: {//出栈Status popData;Status rPop = Pop(linkstack, popData);if (rPop == OK) {printf("向链栈出栈%d成功!\n", popData);} else {printf("向链栈出栈失败!\n");}}break;case 3: {//获取栈顶元素Status topData;Status rTop = Top(linkstack, topData);if (rTop == OK) {printf("向链栈获取栈顶元素:%d\n", topData);} else {printf("向链栈获取栈顶元素失败!\n");}
//                //获取栈顶元素
//                Status rGetTop = GetTop(linkstack);
//                if (rGetTop == OK) {
//                    printf("向链栈获取栈顶元素:%d\n", topData);
//                } else {
//                    printf("向链栈获取栈顶元素失败!\n");
//                }}break;case 4: { //清空Status rClearStack = ClearStack(linkstack);if (rClearStack == OK) {printf("链栈清空成功!\n");} else {printf("链栈清空失败!\n");}}break;case 5: {//销毁Status rDestroyStack = DestoryStack(linkstack);if (rDestroyStack == OK) {printf("链栈销毁成功!\n");} else {printf("链栈销毁失败!\n");}}break;case 6: {//批量插入int on;printf("请输入想要插入的元素个数:\n");scanf("%d", &on);SElemType array[on];for (int i = 1; i <= on; i++) {getchar();printf("向顺序栈第%d个位置插入元素为:", (i));scanf("%d", &array[i]);}for (int i = 1; i <= on; i++) {Status rPush = Push(linkstack, array[i]);if (rPush == OK) {printf("向链栈进栈%d成功!\n", array[i]);} else {printf("向链栈进栈失败!\n");}}}break;case 7: {//判空Status rStackEmpty = stackEmpty(linkstack);if (rStackEmpty == true) {printf("链栈为空栈!\n\n");} elseprintf("链栈不为空!\n\n");}break;case 8: {//链栈的长度Status length = stackLength(linkstack);printf("链栈的长度为:%d 。\n\n", length);}break;case 9: {  //打印栈内元素StackTraverse(linkstack);}break;case 10: {//退出程序return 0;}break;default: {printf("输入错误,无此功能,请检查输入:\n\n");}}}return 1;
}

 四、运行结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/243913.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一周时间,开发了一款封面图生成工具

介绍 这是一款封面图的制作工具&#xff0c;根据简单的配置即可生成一张好看的封面图&#xff0c;目前已有七款主题可以选择。做这个工具的初衷来自平时写文章&#xff0c;都为封面图发愁&#xff0c;去图片 网站上搜索很难找到满意的&#xff0c;而且当你要的图如果要搭配上文…

Eureka整合seata分布式事务

文章目录 一、分布式事务存在的问题二、分布式事务理论三、认识SeataSeata分布式事务解决方案1、XA模式2、AT模式3、SAGA模式4.SAGA模式优缺点&#xff1a;5.四种模式对比 四、微服务整合Seata AT案例Seata配置微服务整合2.1、父工程项目创建引入依赖 2.2、Eureka集群搭建2.3、…

02-编程猜谜游戏

上一篇&#xff1a;01-开始Rust之旅 本章通过演示如何在实际程序中使用 Rust&#xff0c;你将了解 let 、 match 、方法、关联函数、外部crate等基础知识。 本章将实现一个经典的初学者编程问题&#xff1a;猜谜游戏。 工作原理如下&#xff1a;程序将随机生成一个介于 1 和 10…

Qt —— 自定义飞机仪表控件(附源码)

示例效果 部署环境 本人亲测版本Vs2017+Qt5.12.4,其他版本应该也可使用。 源码1 qfi_ADI::qfi_ADI( QWidget *parent ) :QGraphicsView ( parent ),m_scene ( nullptr )

牛客周赛 Round 18 解题报告 | 珂学家 | 分类讨论计数 + 状态DP

前言 整体评价 前三题蛮简单的&#xff0c;T4是一个带状态的DP&#xff0c;这题如果用背包思路去解&#xff0c;不知道如何搞&#xff0c;感觉有点头痛。所以最后还是选择状态DP来求解。 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 游游的整数翻转 这题最好…

.NET国产化改造探索(七)、更改大金仓数据库认证方式

随着时代的发展以及近年来信创工作和…废话就不多说了&#xff0c;这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来&#xff0c;看操作。 之前安装人大金仓数据库的时候&#xff0c;连接数据库所使用的加密方式选择的是scram-sm3&#xff0c;权限管理框架的ORM使用的…

k8s集群异常恢复

前提、我自己的k8s采用的是单master节点两个从节点部署&#xff0c;我针对单master情况进行恢复说明 场景一&#xff1a;正常开关虚拟机&#xff0c;可直接重启kubelet进行恢复 1、1、一般重启后三个节点都需要检查&#xff0c;输入命令检查kubelet&#xff1a; systemctl s…

Linux中普通用户如何使用sudo指令提升权限

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 普通用户为何无法使用sudo&#xff1f; 我们来看一下具体操作 总结 前言 世上有两种耀眼的光芒&#xff0c;一种是正在升起的太阳&#xff0c;一种是正在努力…

电脑 wifi 常断

问题 电脑wifi网络经常断。 详细问题 笔者使用笔记本电脑&#xff0c;发现每过三五分钟&#xff0c;wifi便会自动断开。 解决方案 步骤1、搜索框搜索设备管理器。 步骤2、找到网络适配器并点击。 步骤2、找到网络适配器菜单中的Wireless相关内容&#xff0c;右键&#x…

springcloud +Vue 前后端分离的onlinejudge在线评测系统

功能描述&#xff1a; 本系统的研究内容主要是设计并实现一个一个在线测评系统&#xff08;OJ&#xff09;&#xff0c;该系统集成了博客、竞赛、刷题、教学&#xff0c;公告&#xff0c;个人管理六大功能&#xff0c;用户注册后登录系统&#xff0c;可以浏览本站的全部文章、发…

Redis(五)管道

文章目录 官网总结Pipeline与原生批量命令对比Pipeline与事务对比使用Pipeline注意事项 官网 https://redis.io/docs/manual/pipelining/ Pipeline是为了解决RTT往返回时&#xff0c;仅仅是将命令打包一次性发送对整个Redis的执行不造成其它任何影响 总结 Pipeline与原生批量…

解决 ssh: connect to host github.com port 22: Connection timed out

问题 今天使用git克隆github上的代码时&#xff0c;一直报错 原以为是公钥过期了&#xff0c;就尝试修改配置公钥&#xff0c;但是尝试了几次都不行&#xff0c;最终在博客上找到了解决方案&#xff0c;在次记录一下&#xff0c;以备不时之需 解决ssh-connect-to-host-github…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-9 HTML5 表单验证

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>HTML5 表单验证</title> </head><body> <form action"#" method"get">请输入您的邮箱:<input type"email&q…

python-自动篇-办公-用Excel画画

文章目录 代码所遇问题ModuleNotFoundError: No module named xlsxwriterFileNotFoundError: [Errno 2] No such file or directory: 111.jpg 效果附件图片excel 代码 # coding: utf-8from PIL import Image from xlsxwriter.workbook import Workbookclass ExcelPicture(obje…

前端面试题-(BFC,前端尺寸单位,网站页面常见的优化手段)

前端面试题-BFC&#xff0c;前端尺寸单位&#xff0c;网站页面常见的优化手段 BFC前端尺寸单位网站页面常见的优化手段 BFC BFC&#xff08;block formartting context&#xff09;块格式化上下文。是通过独立渲染的区域&#xff0c;它拥有自己的渲染规则&#xff0c;可以决定…

使用AFPN渐近特征金字塔网络优化YOLOv8改进小目标检测效果(不适合新手)

目录 简单概述 算法概述 优化效果 参考文献 文献地址&#xff1a;paper 废话少说&#xff0c;上demo源码链接&#xff1a; 简单概述 AFPN的核心思想&#xff1a;AFPN主要通过引入渐近的特征融合策略&#xff0c;逐步整合底层、高层和顶层的特征到目标检测过程中。这种融合…

(十一)Head first design patterns状态模式(c++)

状态模式 如何去描述状态机&#xff1f; 假设你需要实例化一台电梯&#xff0c;并模仿出电梯的四个状态&#xff1a;开启、关闭、运行、停止。也许你会这么写 class ILift{ public:virtual void open(){}virtual void close(){}virtual void run(){}virtual void stop(){} }…

8. UE5 RPG创建UI(上)

UI是显示角色的一部分属性玩家可以直接查看的界面&#xff0c;通过直观的形式在屏幕上显示角色的各种信息。如何使用一种可扩展&#xff0c;可维护的形式来制作&#xff0c;这不得不说到耳熟能详的MVC架构。 MVC&#xff08;Model-View-Controller&#xff09;是一种常见的软件…

【C++】IO流

IO流 一、C语言的输入输出二、流的概念三、C IO流1. C标准IO流2. C文件IO流 四、stringstream 的简单介绍1. 将数值类型数据格式化为字符串2. 字符串拼接3. 序列化和反序列化结构数据 一、C语言的输入输出 C语言中我们用到的最频繁的输入输出方式就是 scanf () 与 printf() &a…

HarmonyOS 应用开发入门

HarmonyOS 应用开发入门 前言 DevEco Studio Release版本为&#xff1a;DevEco Studio 3.1.1。 Compile SDK Release版本为&#xff1a;3.1.0&#xff08;API 9&#xff09;。 构建方式为 HVigor&#xff0c;而非 Gradle。 最新版本已不再支持 &#xff08;”Java、JavaScrip…