【数据结构】 链栈的基本操作 (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.mzph.cn/news/642756.shtml

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

相关文章

AtCoder Beginner Contest 337 A~G

A.Scoreboard(循环) 题意&#xff1a; 两个队伍进行 N N N场比赛。在第 i i i场比赛中 &#xff08; 1 ≤ i ≤ N &#xff09; &#xff08;1≤i≤N&#xff09; &#xff08;1≤i≤N&#xff09;&#xff0c;两队各得到 X i X_i Xi​和 Y i Y_i Yi​分。比赛结束后总分更高…

BACnet网关BL121BN 实现稳定可靠、低成本、简单的楼宇自控协议BACnet转OPC UA解决方案

随着楼宇自控系统的迅猛发展&#xff0c;人们深刻认识到在楼宇暖通行业中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于楼宇自控和暖通空调系统应用中。 钡铼技术…

[反转链表] [合并两个有序链表][分割链表]

这里写目录标题 反转链表合并两个有序链表分割链表 反转链表 1、题目&#xff1a; 2.思路  思路1&#xff1a;建立一个newHead,取一个节点进行头插。具体做法如下&#xff01; 建立一个newHead(新头)&#xff0c;由于一个节点里面存的是下一个节点的地址&#xff0c;如果取…

VS2019查看文件编码格式

文件->高级保存选项 在这里可以看见现在的编码格式也可以修改编码格式 如果没有高级保存选项的话可以参考这篇博客进行设置

Vue (v-bind指令、el与data的两种写法、理解MVVM、数据代理、V-no事件处理、双向数据绑定V-model、登陆页面实现

V-bind指令 el与data两种写法 MVVM 数据代理 V-no事件处理 V-no用于监听DOM对象 双向数据绑定V-model v-model 指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定&#xff0c;根据表单上的值&#xff0c;自动更新绑定的元素的值。 按钮的…

激光雷达行业梳理1-概述、市场、技术路线

激光雷达作为现代精确测距和感知技术的关键组成部分&#xff0c;在近几年里取得了令人瞩目的发展。作为自动驾驶感知层面的重要一环&#xff0c;相较摄像头、毫米波雷达等其他传感器具有“ 精准、快速、高效作业”的巨大优势&#xff0c;已成为自动驾驶的主传感器之一&#xff…

网络安全的概述

网络空间的概念 2003年美国提出网络空间的概念&#xff1a;一个由信息基础设施组成的互相依赖的网络。 我国官方文件定义&#xff1a;网络空间为继海&#xff0c;陆&#xff0c;空&#xff0c;天以外的第五大人类活动领域 网络安全发展历史 通信保密阶段 --- 计算机安全阶段…

API接口安全总结

接口分类 HTTP接口 RPC接口&#xff08;客户端和服务器端的连接 例如游戏登陆&#xff09;非web协议&#xff0c;PRC 远程过程调用 Remote Procedure Call&#xff0c;其就是一个节点请求另外一个节点提供的服务。当两个物理分离的子系统需要建立逻辑上的关联时&#xff0c;R…

1 认识微服务

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff1a;将业务的所有…

k8s集群异常恢复

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

时限挑战——深度解析Pytest插件 pytest-timeout

在软件开发中,测试用例的执行时间通常是一个关键考虑因素。Pytest插件 pytest-timeout 提供了一个强大的插件,允许你设置测试用例的超时时间。本文将深入介绍 pytest-timeout 插件的基本用法和实际案例,助你精确掌控测试用例的执行时限。 什么是pytest-timeout? pytest-tim…

python环境安装sklearn及报错解决

安装 如刚开始安装&#xff0c;还未遇到问题请直接从重新安装库开始看&#xff0c;如果遇到报错&#xff0c;从问题开始看 问题 python安装sklearn报错 &#xff0c;报错信息如下 File "<stdin>", line 1pip install scikit-learn^ SyntaxError: invalid s…

第7章 7.6.5 常量指针 Page406~407

const可以限制指针指向的数据&#xff0c;也可以限制指针的指向 const限制指针指向的数据&#xff0c;不可以修改指向的数据&#xff0c;可以改变指向 推荐写法 常见写法&#xff1a;

用Excel辅助做数独

做数独游戏的时候&#xff0c;画在纸上很容易弄花眼&#xff0c;所以我考虑用Excel辅助做一个。 界面如下&#xff1a; 按下初始化表格区域按钮&#xff0c;会在所有单元格中填充“123456789”。如下图&#xff1a; 当某个单元格删除得只剩一个数字时&#xff0c;会将同一行、…

《大型语言模型自然语言生成评估》综述

在快速发展的自然语言生成&#xff08;NLG&#xff09;评估领域中&#xff0c;引入大型语言模型&#xff08;LLMs&#xff09;为评估生成内容质量开辟了新途径&#xff0c;例如&#xff0c;连贯性、创造力和上下文相关性。本综述旨在提供一个关于利用LLMs进行NLG评估的全面概览…

一篇就学会接口,全网最详细的接口测试

大多数人对于接口测试都觉得是一种高大上的测试&#xff0c;觉得学会接口测试就可以从小白测试员&#xff0c;变成了高级测试员&#xff0c;但其实接口测试只是测试的基础内容 什么是接口 接口泛指实体把自己提供给外界的一种抽象化物&#xff08;可以为另一实体&#xff09;&…

开始学习Vue2(脚手架,组件化开发)

一、单页面应用程序 单页面应用程序&#xff08;英文名&#xff1a;Single Page Application&#xff09;简 称 SPA&#xff0c;顾名思义&#xff0c;指的是一个 Web 网站中只有唯一的 一个 HTML 页面&#xff0c;所有的功能与交互都在这唯一的一个页面内完成。 二、vue-cli …

java web mvc-02-struts2

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails Struts2 Apache Struts是一个用于创…

Redis 笔记二

概览 1.高并发秒杀问题及可能出现的bug 2.秒杀场景JVM级别锁和分布式锁 3.大厂分布式锁Redisson框架 4.从Redisson源码剖析lua解决锁原子性问题 5.从Redisson源码剖析经典锁续命问题 6.Redis主从架构锁失效如何解决 7.Redlock分布式锁高并发下可能存在的问题 8.双十一大促如何将…

alfred自定义谷歌翻译workflow

如果要实现自定义workflow&#xff0c;则必须安装付费版的alfred&#xff0c;囊中羞涩的话可以自行淘宝。自定义步骤如下&#xff1a; 1. 新建空的workflow&#xff0c;填写基本信息 2. 开发python脚本 打开该workflow所在目录&#xff0c;进行下面步骤&#xff1a; 首先安装…