【数据结构】栈的顺序存储(整型栈、字符栈)

【数据结构】栈的顺序存储(整型栈、字符栈)

      • 一、栈的结构定义
      • 二、字符栈的初始化、入栈、出栈、判断是否栈为空、获取栈顶元素、获取栈的当前元素个数等操作
      • 三、整型栈的初始化、入栈、出栈、判断是否栈为空、获取栈顶元素、获取栈的当前元素个数等操作

一、栈的结构定义

MaxSize: 顺序栈的长度
s.top: 指针,指向栈顶元素。当栈为空时,指向-1。
s.data[MaxSize]: 顺序栈,用数组表示

#define MaxSize 50
typedef struct SqStack{char data[MaxSize]; // 数据 int top; // 指针 
}SqStack;
栈空s.top = -1
栈满s.top = MaxSize - 1
栈顶元素s.data[s.top]
栈的当前元素个数s.top + 1(因为元素从索引0开始,所以元素个数是:索引值+1)

二、字符栈的初始化、入栈、出栈、判断是否栈为空、获取栈顶元素、获取栈的当前元素个数等操作

#include <stdio.h>
using namespace std;#define MaxSize 50
typedef struct SqStack{char data[MaxSize]; // 数据 int top; // 指针 
}SqStack;//InitStack(&s):初始化一个空栈 S。
void InitStack(SqStack &s){s.top = -1;
}//StackEmpty(s):判断一个栈是否为空,若栈s为空则返回 true,否则返回 false。
bool StackEmpty(SqStack s){if(s.top == -1) return true;return false;
}//Push(&s,x): 入栈,若栈s未满,则将x加入使之成为新栈顶。
bool Push(SqStack &s, char x){if(s.top == MaxSize - 1) return false;s.data[++s.top] = x;return true;
}//Pop(&S,&x):出栈,若栈s非空,则弹出栈顶元素,并用x返回。
bool Pop(SqStack &s, char &x){if(s.top == -1) return false;x = s.data[s.top--];return true;
}//GetTop(s,&x):读栈顶元素,但不出栈,若栈s非空,则用x返回顶元素。
bool GetTop(SqStack s, char &x){if(s.top == -1) return false;x = s.data[s.top];return true;	
}//Destroystack(&s):销毁栈,并释放栈s占用的存储空间(“&”表示引用调用)。//getNum(s): 获取栈的当前元素个数
int GetNum(SqStack s){if(s.top == -1) return 0;return s.top + 1;
} 
int main() {SqStack s;InitStack(s); bool flag = true;int choose;while(flag){printf("\n=======================\n");printf("1.入栈\n");printf("2.出栈\n");printf("3.判断是否栈为空\n");printf("4.读栈顶元素\n");printf("5.获取栈的当前元素个数\n");printf("6.退出\n");printf("=======================\n");printf("请选择:");scanf("%d", &choose);switch(choose) {case 1:char x;printf("输入要新入栈的字符:");scanf(" %c", &x); // 注意,此时%c前面需要加个空格,使得scanf跳过任何空白字符(包括换行符),然后读取下一个非空白字符。 if(Push(s, x)) printf("成功把%c入栈!\n", x);else printf("入栈失败!\n");break;case 2:char x2;if(Pop(s, x2)) printf("%c出栈成功!\n", x2);else printf("出栈失败!\n");break;case 3:if(StackEmpty(s)) printf("栈为空!\n");else printf("栈暂时不为空!\n");break;case 4:char x3;if(GetTop(s, x3)) printf("当前栈的栈顶元素是:%c\n", x3);else printf("出错!\n");break;case 5:printf("栈的当前元素个数是:%d", GetNum(s));break;case 6:flag = false;break; default:printf("非法输入!\n");break;	 } }
}

三、整型栈的初始化、入栈、出栈、判断是否栈为空、获取栈顶元素、获取栈的当前元素个数等操作

很简单,只是把data数组及参数x的数据类型从char改为int类型就好了。

#include <bits/stdc++.h>
using namespace std;/*
栈空: top = -1
栈满: top = MaxSize - 1
栈顶元素: SqStack[top] 
*/
#define MaxSize 50
typedef struct SqStack{int data[MaxSize]; // 数据 int top; // 指针 
}SqStack;//InitStack(&s):初始化一个空栈 S。
void InitStack(SqStack &s){s.top = -1;
}//StackEmpty(s):判断一个栈是否为空,若栈s为空则返回 true,否则返回 false。
bool StackEmpty(SqStack s){if(s.top == -1) return true;return false;
}//Push(&s,x): 入栈,若栈s未满,则将x加入使之成为新栈顶。
bool Push(SqStack &s, int x){if(s.top == MaxSize - 1) return false;s.data[++s.top] = x;return true;
}//Pop(&S,&x):出栈,若栈s非空,则弹出栈顶元素,并用x返回。
bool Pop(SqStack &s, int &x){if(s.top == -1) return false;x = s.data[s.top--];return true;
}//GetTop(s,&x):读栈顶元素,但不出栈,若栈s非空,则用x返回顶元素。
bool GetTop(SqStack s, int &x){if(s.top == -1) return false;x = s.data[s.top];return true;	
}//Destroystack(&s):销毁栈,并释放栈s占用的存储空间(“&”表示引用调用)。//getNum(s): 获取栈的当前元素个数
int GetNum(SqStack s){if(s.top == -1) return 0;return s.top + 1;
} 
int main() {SqStack s;InitStack(s); bool flag = true;int choose;while(flag){printf("\n=======================\n");printf("1.入栈\n");printf("2.出栈\n");printf("3.判断是否栈为空\n");printf("4.读栈顶元素\n");printf("5.获取栈的当前元素个数\n");printf("6.退出\n");printf("=======================\n");printf("请选择:");scanf("%d", &choose);switch(choose) {case 1:int x;printf("输入要新入栈的字符:");scanf("%d", &x);if(Push(s, x)) printf("成功把%d入栈!\n", x);else printf("入栈失败!\n");break;case 2:int x2;if(Pop(s, x2)) printf("%d出栈成功!\n", x2);else printf("出栈失败!\n");break;case 3:if(StackEmpty(s)) printf("栈为空!\n");else printf("栈暂时不为空!\n");break;case 4:int x3;if(GetTop(s, x3)) printf("当前栈的栈顶元素是:%d\n", x3);else printf("出错!\n");break;case 5:printf("栈的当前元素个数是:%d", GetNum(s));break;case 6:flag = false;break; default:printf("非法输入!\n");break;	 } }
}

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

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

相关文章

【大模型实战】向量数据库实战 - Chroma Milvus

在 RAG&#xff08;检索增强生成&#xff09;场景中&#xff0c;非结构化数据&#xff08;文本、图像等&#xff09;的高效检索是核心需求。传统关系型数据库难以胜任&#xff0c;而向量数据库通过将数据转化为向量、基于相似度快速匹配&#xff0c;成为 RAG 的关键支撑。本文聚…

pytorch程序语句固定开销分析

深入探索PyTorch与Python的性能微观世界&#xff1a;量化基础操作的固定开销 在深度学习的性能优化工作中&#xff0c;开发者通常将目光聚焦于模型结构、算法效率和并行计算策略。然而&#xff0c;在这些宏观优化的背后&#xff0c;构成我们代码的每一条基础语句——无论是PyTo…

ABP VNext + CloudEvents:事件驱动微服务互操作性

ABP VNext CloudEvents&#xff1a;事件驱动微服务互操作性 &#x1f680; &#x1f4da; 目录ABP VNext CloudEvents&#xff1a;事件驱动微服务互操作性 &#x1f680;一、引言 ✨☁️ TL;DR&#x1f4da; 背景与动机&#x1f3d7;️ 整体架构图二、环境准备与依赖安装 &am…

软件测试测评公司关于HTTP安全头配置与测试?

浏览器和服务器之间那几行看不见的HTTP安全头配置&#xff0c;往往是抵御网络攻击的关键防线。作为软件测试测评公司&#xff0c;我们发现超过六成的高危漏洞源于安全头缺失或误配。别小看这些响应头&#xff0c;它们能直接掐断跨站脚本、点击劫持、数据嗅探的攻击路径。五条命…

Mysql集成技术

目录 mysql的编译安装与部署 1.编译安装mysql 2.部署mysql mysql主从复制 什么是mysql主从复制&#xff1f; 1.配置master 2.配置slave 3.存在数据时添加slave2 4.GTID模式 什么是GTID模式&#xff1f; 配置GTID 5.延迟复制 6.慢查询日志 核心作用 开启慢查询日志…

《MySQL进阶核心技术剖析(一): 存储引擎》

目录 一、存储引擎 1.1 MySQL体系结构 1.2 存储引擎介绍 1). 建表时指定存储引擎 2). 查询当前数据库支持的存储引擎 1.3 存储引擎特点 1.3.1 InnoDB 1.3.2 MyISAM 1.3.3 Memory 1.3.4 区别及特点 1.4 存储引擎选择 一、存储引擎 1.1 MySQL体系结构 1). 连接层 最上…

sqli-labs:Less-26关卡详细解析

1. 思路&#x1f680; 本关的SQL语句为&#xff1a; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入类型&#xff1a;字符串型&#xff08;单引号包裹&#xff09;、GET操作提示&#xff1a;参数需以闭合关键参数&#xff1a;id php输出语句的部分代码&am…

Spring Boot 的事务注解 @Transactional 失效的几种情况

开发中我们经常会用到 Spring Boot 的事务注解&#xff0c;为含有多种操作的方法添加事务&#xff0c;做到如果某一个环节出错&#xff0c;全部回滚的效果。但是在开发中可能会因为不了解事务机制&#xff0c;而导致我们的方法使用了 Transactional 注解但是没有生效的情况&…

#C语言——刷题攻略:牛客编程入门训练(四):运算

&#x1f31f;菜鸟主页&#xff1a;晨非辰的主页 &#x1f440;学习专栏&#xff1a;《C语言刷题合集》 &#x1f4aa;学习阶段&#xff1a;C语言方向初学者 ⏳名言欣赏&#xff1a;"代码行数决定你的下限&#xff0c;算法思维决定你的上限。" 目录 1. BC25 牛牛买电…

阻抗分析中的软件解调计算

接上篇 重温无功功率测量-CSDN博客 已知被测阻抗两端电压与流过 通过两个ADC同步采集到。 激励频率10k, 采样率1M, 每周期100个点 关键是:采样率除以激励频率, 得是4的倍数... 所以ADC不能自由运行, 得用一个timer来触发. 因为要进行同相分量正交分量计算。 1&#xff1a;直…

ubuntu 镜像克隆

一、克隆 1、准备 一个u盘&#xff08;制作启动盘&#xff09; 一个移动固态硬盘&#xff08;大于要克隆系统盘的1.2倍&#xff09; 2、使用 rufus生成系统启动盘 &#xff08;1&#xff09;下载ubuntu iso 桌面版 https://cn.ubuntu.com/download &#xff08;2&#x…

Axure下拉菜单:从基础交互到高保真元件库应用

在Web端产品设计中&#xff0c;下拉菜单&#xff08;Dropdown Menu&#xff09; 是用户与系统交互的核心组件之一&#xff0c;它通过隐藏次要选项、节省页面空间的方式&#xff0c;提升信息密度与操作效率。无论是基础下拉菜单、图标式下拉菜单&#xff0c;还是复杂的多级下拉菜…

复现YOLOV5+训练指定数据集

一、复现YOLOV5代码 1.github下载&#xff1a;https://github.com/MIPIT-Team/SSA-YOLO 2.配置环境&#xff1a;创建虚拟环境yolo5 conda create -n yolo5 python3.9 #对应文件夹下pip install -r requirements.txt报错&#xff1a;ERROR: pips dependency resolver does no…

Agents-SDK智能体开发[4]之集成MCP入门

文章目录说明一 Agents SDK接入MCP1.1 MCP技术回顾1.2 MCP基础实践流程1.2.1 天气查询服务器Server创建流程1.2.2 服务器依赖安装和代码编写1.2.3 环境配置文件1.2.4 客户端代码编写1.3 测试运行二 MCPAgents SDK基础调用2.1 weather_server.py2.2 client_agent.py2.3 运行测试…

Camera相机人脸识别系列专题分析之十九:MTK ISP6S平台FDNode传递三方FFD到APP流程解析

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: Camera相机人脸识别系列专题分析之十九:MTK平台FDNode传递三方FFD到APP流程解析 目录 一、背景 二、:OcamMeta传递FFD到APP 2.1:OcamMeta 2.2 :OcamMeta::process更新FFD 2.…

【实时Linux实战系列】构建实时监测与报警系统

在实时系统中&#xff0c;监测与报警系统是确保系统正常运行和及时响应异常情况的关键组件。实时监测与报警系统能够实时收集系统数据&#xff0c;分析关键事件&#xff0c;并在检测到异常时发出警报。这种系统广泛应用于工业自动化、医疗设备监控、网络安全等领域。掌握实时监…

PHP入门及数据类型

PHP数据类型 PHP标记 //HTML风格 <?phpecho "hello world"; ?> //简短风格 <?echo "hello world"; ?>数据类型 PHP 最初源于 Perl 语言&#xff0c;与 Perl 类似&#xff0c;PHP 对数据类型采取较为宽松的态度。PHP 规定&#xff0c;变量数…

沸点 | 嬴图参加世界人工智能大会

2025 WAIC于 7 月 26 日至 28 日在上海举行。大会展览面积突破 7 万平方米&#xff0c;800 余家企业参展。嬴图作为图数据库领域的领先企业&#xff0c;携前沿技术与创新应用精彩亮相。​大会期间&#xff0c;嬴图创始人兼CEO孙宇熙与来自全球的顶尖学者、企业代表共同探讨人工…

2. 字符设备驱动

一、设备号 1.1. 什么是设备号 设备号是用来标记一类设备以及区分这类设备中具体个体的一组号码。 设备号由主设备号和次设备号组成。主设备号的作用为标记一类设备、用于标识设备驱动程序,而次设备号的作用是为了区分这类设备中的具体个体设备及用于标识同一驱动程序下的具…

uboot armv8 启动流程之 linker script

section 详细说明.text按如下顺序&#xff0c;中断向量表vectors, 启动入口代码start.o,普通text, glue &#xff08;arm thumb2 相互调用时自动生成的代码&#xff09;*(.vectors)CPUDIR/start.o (.text*)*(.text*)*(.glue*)__image_copy_start 标记为text 段入口&#xff0c;…