数据结构之栈的基本操作

该顺序栈涉及到了存储整型数据的顺序栈还有存储字符型数据的顺序栈
实现的功能有:入栈、出栈、判断是否为空栈、求栈的长度、清空栈、销毁栈、得到栈顶元素
此外根据上述功能,编写了数值转换(十进制转化八进制)方法、括号匹配方法。

#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
#include<iostream>
using namespace std;
#define  STACK_INIT_SIZE  100
#define  STACKINCREMENT  10
#define OK 1
#define TRUE 1
#define FALSE 0
#define OVERFLOW 0
#define ERROR 0typedef int Status;
typedef char SChar;
typedef int SElemType;//定义栈,栈中存储的数据为整型数据 
typedef  struct
{SElemType* base;     //栈底指针SElemType* top;      //栈顶指针int  stacksize;            //当前已分配的存储空间
}SqStackInt, * SqslinkInt;      //顺序栈说明符//定义栈,栈中存储的数据为字符型数据 
typedef  struct
{SChar* base;     //栈底指针SChar* top;      //栈顶指针int  stacksize;            //当前已分配的存储空间
}SqStackChar, * SqslinkChar;      //顺序栈说明符//下面为 “栈中存储的数据为整型数据 ”的基本操作 
Status InitStackInt(SqStackInt& S) {//分配内存空间S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));if (!S.base)exit(OVERFLOW);//分配失败S.top = S.base;S.stacksize = STACK_INIT_SIZE;//顺序栈最大的长度return OK;
}
//求顺序栈(整形数据)的长度
Status StackIntList(SqStackInt& S) {int list = (S.top - S.base);//栈的头指针减去尾指针就是长度printf("该顺序栈的长度为:%5d\n", list);return OK;
}
//清空顺序栈(整形数据)
Status ClearStackInt(SqStackInt& S) {S.top = S.base;printf("该整形顺序栈已经清空!");return OK;
}
//判断顺序栈(整形数据)是否为空栈
Status StackEmptyInt(SqStackInt S) {if (S.base == S.top) {printf("该整形顺序栈是空栈!");return TRUE;}else return FALSE;
}
//在顺序栈(整形数据)中得到栈顶元素
SElemType GetTop(SqStackInt& S, SElemType& e) {if (S.top == S.base) {return ERROR;}e = *(S.top - 1);//取出栈顶元素return OK;
}
//在顺序栈(整形数据)中进栈
Status PushInt(SqStackInt& S, SElemType e) {//判断栈是不是满了,如果满了就增加内存空间if (S.top - S.base >= S.stacksize) {S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));if (!S.base) exit(OVERFLOW);//realloc失败了S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;}
//在顺序栈(整形数据)中出栈
Status PopInt(SqStackInt& S, SElemType& e) {if (S.top == S.base) return ERROR;e = *--S.top;// printf("出栈的元素:%5d\n", e);int numer = e;return numer;
}
//销毁顺序栈(整形数据)
Status DestroyStackInt(SqStackInt& S) {S.stacksize = 0;//销毁后栈的长度为零S.top = S.base;free(S.base);//释放栈底S.top = S.base = NULL;printf("该顺序栈已被销毁");return OK;
}//下面为 “栈中存储的数据为字符型数据 ”的基本操作 
Status InitStackChar(SqStackChar& S) {S.base = (SChar*)malloc(STACK_INIT_SIZE * sizeof(SChar));if (!S.base)exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;
}Status ClearStackChar(SqStackChar& S) {S.top = S.base;return OK;
}Status StackEmptyChar(SqStackChar S) {if (S.base == S.top) return TRUE;else return FALSE;
}SChar GetTopChar(SqStackChar& S) {SChar e;if (S.top == S.base) return ERROR;e = *(S.top - 1);return e;
}Status PushChar(SqStackChar& S, SChar e) {if (S.top - S.base >= S.stacksize) {S.base = (SChar*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SChar));if (!S.base) exit(OVERFLOW);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;
}SChar  PopChar(SqStackChar& S, SChar& e) {if (S.top == S.base) return ERROR;e = *--S.top;char data = e;return data;
}Status DestroyStackChar(SqStackChar& S) {free(S.base);return OK;
}//数制转换算法 
void conversion() {SqStackInt S;InitStackInt(S);int N;printf("请输入一个数:");scanf("%d", &N);while (N) {PushInt(S, N % 8);//如果N÷8的余数不为零就进栈N = N / 8;}SElemType e;while (!StackEmptyInt(S)) {PopInt(S, e);//所有余数出栈printf("%d", e);}} // conversion//括号匹配算法
Status  Matching()
{SqStackChar S;InitStackChar(S);int i =0; char x; ClearStackChar(S);SChar E[100];printf("请输入一组括号(以#结束):");scanf("%s", &E);printf("你输入的是:%s\n", E);while (E[i] != '#'){if (E[i] == '(' || E[i] == '[') {PushChar(S, E[i]);   //(,[ 进栈}if (E[i] ==')' || E[i] == ']'){if (StackEmptyChar(S)) {return(ERROR);}//不匹配,返回0else {x = PopChar(S, E[i]);  //出栈,x为相应左括号if (x == '(' && E[i] == ']' || x == '[' && E[i] == ')') {                  return(ERROR);}}    //不匹配返回0}i++;}if (StackEmptyChar(S))  return(OK);   //括号匹配,返回1else return(ERROR);  //不匹配返回0}  //Matchingint main()
{SqStackInt int_S;InitStackInt(int_S);//初始化栈SElemType enterData_Int;//定义进栈的元素变量,对其赋值SElemType outData_Int;//元素出栈用此接受int n;//后面要进行的操做数,可以对其赋值SElemType e;//定义得到栈顶元素的变量int result;while (1){printf("\n\n\n");printf("请从下面菜单中选择要操作的项:\n");printf("1、数制转换(十进制转换八进制)\n");printf("2、括号匹配\n");printf("3、整形数据元素进栈\n");printf("4、整形数据元素出栈\n");printf("5、求整形顺序栈的长度\n");printf("6、清空整形顺序栈\n");printf("7、销毁整形顺序栈\n");printf("8、判断整形顺序栈是否为空栈\n");printf("9、得到整形顺序栈的栈顶元素\n");printf("0、退出\n");printf("请输入1-9的数或者输入0结束程序:\n");scanf("%d", &n);switch (n) {case 1:conversion();break;case 2:result = Matching();if (result == OK)printf("括号匹配成功\n");elseprintf("括号匹配不成功\n");break;case 3:printf("请输入要进栈的整形数据元素:\n");scanf("%d", &enterData_Int);PushInt(int_S, enterData_Int);break;case 4:/* scanf("%d", &eOut);*/int num ;num= PopInt(int_S, outData_Int);printf("出栈的元素是:%5d\n", num);break;case 5:StackIntList(int_S);break;case 6:ClearStackInt(int_S);break;case 7:DestroyStackInt(int_S);break;case 8:StackEmptyInt(int_S);break;case 9:GetTop(int_S,e);break;case 0:exit(0);break;default:printf("输入数值错误,请重新输入\n"); break;}}return OK;
}

控制台界面展示:
在这里插入图片描述

进栈展示,以进栈三个整形数据元素为例:
在这里插入图片描述

出栈展示:

在这里插入图片描述

数值转换演示,86(十进制数)——>126(八进制):
在这里插入图片描述

括号匹配演示:
在这里插入图片描述

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

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

相关文章

Spring Boot - 利用Resilience4j-Circuitbreaker实现断路器模式_防止级联故障

文章目录 PreResilience4j概述Resilience4j官方地址Resilience4j-Circuitbreaker应用场景微服务演示Address servicePOMModelRepositoryServiceControllerData InitProperties测试 Order serviceModelRepositoryServiceSet UpProperties测试 探究断路器调用order-service API 2…

卷积和滤波对图像操作的区别

目录 问题引入 解释 卷积 滤波 问题引入 卷积和滤波是很相似的&#xff0c;都是利用了卷积核进行操作 那么他们之间有什么区别呢&#xff1f; 卷积&#xff1a;会影响原图大小 滤波&#xff1a;不会影响原图大小 解释 卷积 我们用这样一段代码来看 import torch.nn as …

【AI接口】语音版、文心一言大模型和AI绘图、图片检测API

文章目录 一、语音版大模型AI1、接口2、请求参数3、请求参数示例4、接口返回示例 二、AI图片鉴黄合规检测API1、接口2、请求参数3、请求参数示例4、接口返回示例5、报错说明6、代码开源 三、人工智能AI绘画API1、接口2、请求参数3、请求参数示例4、接口返回示例5、AI绘画成果展…

Gin 框架之用户密码加密

文章目录 一、引入二、密码加密位置三、如何加密四、bcrypt 库加密4.1 介绍4.2 优点&#xff1a;4.3 使用 五、小黄书密码加密实践 一、引入 Gin是一个用Go语言编写的Web框架&#xff0c;而用户密码的加密通常是在应用程序中处理用户身份验证时的一个重要问题。 通常敏感信息…

3D可视化:陶瓷烧制的未来之路

陶瓷&#xff0c;这一古老的艺术形式&#xff0c;见证了中华文明的辉煌。然而&#xff0c;随着时代的变迁&#xff0c;传统的陶瓷烧制过程正面临着诸多挑战。如何将这门千年技艺传承下去&#xff0c;并在现代社会中焕发新的光彩&#xff1f;3D可视化技术为我们打开了一扇通往未…

基于springboot+vue的蜗牛兼职网的设计与实现系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

第02章_变量与运算符(关键字,标识符,变量,基本数据类型,进制,运算符,字符集)

文章目录 第02章_变量与运算符本章专题与脉络1. 关键字&#xff08;keyword&#xff09;2. 标识符( identifier)3. 变量3.1 为什么需要变量3.2 初识变量3.3 Java中变量的数据类型3.4 变量的使用3.4.1 步骤1&#xff1a;变量的声明3.4.2 步骤2&#xff1a;变量的赋值 4. 基本数据…

Elastic Stack 8.12:通过对 ES|QL 等的改进增强了向量搜索

作者&#xff1a;来自 Elastic Tyler Perkins, Shani Sagiv, Gilad Gal, Ninoslav Miskovic Elastic Stack 8.12 构建于 Apache Lucene 9.9&#xff08;有史以来最快的 Lucene 版本&#xff09;之上&#xff0c;基于我们对标量量化和搜索并发性的贡献&#xff0c;为文本、向量和…

仿“今日头条”的开源多媒体资讯发布系统

伴随着互联网的普及、用户的时间碎片化&#xff0c;使得信息传播方式发生了巨大变化&#xff0c;因此我们看到微信、微博、今日头条、抖音、快手等平台迅速崛起。这些新的信息传播方式给广大用户带来了极大的便利&#xff0c;同时也给每个人的思想和生活带来了潜移默化的影响。…

代码随想录 Leetcode459. 重复的子字符串(KMP算法)

题目&#xff1a; 代码&#xff08;首刷看解析 KMP算法 2024年1月18日&#xff09;&#xff1a; class Solution { public:void getNext(string& s,vector<int>& next) {int j 0;next[0] j;for (int i 1; i < s.size(); i) {while (j > 0 && s…

三大3D引擎对比,直观感受AMRT3D渲染能力

作为当前热门的内容呈现形式&#xff0c;3D已经成为了广大开发者、设计师工作里不可或缺的一部分。 用户对于3D的热衷&#xff0c;源于其带来的【沉浸式体验】和【超仿真视觉效果】。借此我们从用户重点关注的四个3D视觉呈现内容&#xff1a; 材质- 呈现多元化内容水效果- 展…

【Git】常用的Git操作集合

常用的Git操作集合 1. 分支操作1.1 查看本地所有分支git branch 1.2 查看所有分支&#xff08;包含本地远程仓库&#xff09;git branch -a 1.3 切换分支git checkout test 2. 常用基本操作2.1 查看 git 各存储区内(文件)状态git status 2.2 查看工作区与暂存区文件差异git dif…

揭开UI设计的神秘面纱:如何打造一款让用户爱不释手的移动APP

文章目录 一、目标用户分析二、设计风格和色彩搭配三、布局和导航设计四、交互设计五、视觉元素设计六、响应式设计七、测试和优化八、持续更新和迭代九、团队协作和沟通十、学习和成长《移动APP UI设计与制作(微课版)》编辑推荐内容简介目录 《Flutter入门经典&#xff08;移动…

【vue】ant-col多列栅格式的表单排列方式布局异常:

文章目录 一、效果&#xff1a;二、解决&#xff1a;三、问题&#xff1a; 一、效果&#xff1a; 二、解决&#xff1a; 在row中添加布局类型&#xff1a;type“flex” 三、问题&#xff1a; 后期正式环境还是存在该问题 >>>.ant-form-item {max-height: 32px; }多…

搭建web网站

要求 1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.openlab.com/student](http://www.openlab.com/student) 网站访问学生信…

【Linux 命令】tree 对目录进行树形展示

目录 1、tree 命令功能展示 2、tree 命令安装 3、tree 命令语法及其参数功能 4、终止 tree 展开树命令 1、tree 命令功能展示 在 Linux 中&#xff0c;我们使用 ll 命令对目录的展示并不太方便我们查看&#xff0c;不太清晰明了&#xff0c;所以我们可以使用 tree 命令以…

分类预测 | Matlab实现KPCA-EBWO-SVM分类预测,基于核主成分分析和改进的白鲸优化算法优化支持向量机分类预测

分类预测 | Matlab实现KPCA-EBWO-SVM分类预测&#xff0c;基于核主成分分析和改进的白鲸优化算法优化支持向量机分类预测 目录 分类预测 | Matlab实现KPCA-EBWO-SVM分类预测&#xff0c;基于核主成分分析和改进的白鲸优化算法优化支持向量机分类预测分类效果基本描述程序设计参…

GO基础进阶篇 (十四)、Http编程

Web基础概念 web应用程序 web程序可以提供浏览器访问的程序。Web应用程序通常采用客户端-服务器模型。客户端是用户使用的Web浏览器或其他Web客户端&#xff0c;而服务器是存储和处理数据的远程计算机。 我们能访问到的任何一个页面或资源&#xff0c;都存在于世界的某一个角落…

TDengine 创始人陶建辉在汽车 CIOCDO 论坛发表演讲,助力车企数字化转型

当前&#xff0c;汽车行业的数字化转型如火如荼。借助数字技术的充分利用&#xff0c;越来越多的车企进一步提升了成本优化、应用敏捷性、高度弹性和效率。这一转型使得业务应用的开发和管理模式发生了颠覆性的创新&#xff0c;赋予了汽车软件快速响应变化和动态调度资源的能力…

仓储的未来:为叉车配备智能设备

近年来&#xff0c;数字化和自动化极大地重塑了仓储行业。叉车是仓库的主力&#xff0c;正在配备智能设备以简化操作。 点击下载Dynamsoft最新版https://www.evget.com/product/3691/download 智能叉车的序列化艺术 序列化是为每个商品或托盘分配唯一标识符&#xff08;通常采…