数据结构之栈的基本操作

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

#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.rhkb.cn/news/241134.html

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

相关文章

服务器变矿机,该如何应对?

开始 恶意的挖矿程序会导致服务器cpu的异常占用&#xff0c;很让人讨厌。起初&#xff0c;我只是使用top命令显示出占用cpu不正常的进程&#xff0c;发现其中一个进程占用了百分之九十九点几&#xff0c;然后通过kill -9 <PID>命令干掉它。但总是过不了几天&#xff0c;…

深度学习:探索人工智能的前沿

1. 引言 1.1 人工智能的演进 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机能够执行通常需要人类智能的任务的领域。从早期的符号推理到现代的深度学习&#xff0c;人工智能经历了漫长的发展过程。 20世纪50年代&#xff…

MySQL 基于创建时间进行RANGE分区

MySQL是一款广泛使用的关系型数据库。在MySQL中&#xff0c;大量数据场景提高查询效率是非常关键的&#xff0c;所以&#xff0c;对数据表进行分区是一个很好的选择。 在创建分区表之前&#xff0c;需要了解一下MySQL分区的基本概念。MySQL分区可以将一个大表分成多个小表&…

K8s 网关选型血泪史

Sealos 公有云几乎打爆了市面上所有主流的开源网关&#xff0c;本文可以给大家很好的避坑&#xff0c;在网关选型方面做一些参考。 Sealos Cloud 的复杂场景 Sealos 公有云上线以来&#xff0c;用户呈爆发式增长&#xff0c;目前总共注册用户 8.7w&#xff0c;每个用户都去创…

FFmpeg之AVFormat

文章目录 一、概述二、解封装流程三、重要结构体3.1、AVFormatContext3.2、AVInputFormat3.3、AVOutputFormat3.4、AVStream 四、重要函数分析4.1、avformat_alloc_context4.2、avformat_open_input4.2.1、init_input4.2.2、av_probe_input_format2 4.3、avformat_find_stream_…

Flutter开发之蓝牙链接传输数据

本文使用的是flutter_blue_plus插件来实现链接蓝牙之后&#xff0c;和设备直接实现数据互相传输的功能。 1、配置蓝牙权限 iOS权限设置<key>NSBluetoothAlwaysUsageDescription</key><string>App需要您的同意,才能访问蓝牙,进行设备连接,数据通讯服务</…

LeetCode 热题 100 | 双指针(上)

目录 1 283. 移动零 2 11. 盛最多水的容器 3 15. 三数之和 菜鸟做题第一周&#xff0c;语言是 C 1 283. 移动零 解题思路&#xff1a; 两个指针一前一后遍历数组前者永远指向 0&#xff0c;后者永远在寻找非 0 数的路上后者找到一个非 0 数就和前者进行一个数值交换 …

Qt应用开发(安卓篇)——Hello Qt On Android

一、前言 这一篇从实际出发&#xff0c;讲述如何创建、编译和部署Qt On Android项目。 二、ADB调试 ADB的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用&#xff0c;主要用于连接计算机与Android 设备&#xff0c;以便进行调试和数据传输。ADB 可以实现以下主要…

分享一个美美的html模板

在这个万物vue的年代&#xff0c;网页设计越来越框架化。 上网搜个资料学习学习吧&#xff0c;咵咵咵&#xff0c;“游泳健身&#xff0c;vue了解一下” 我只是想简单地学个html&#xff0c;js啊&#xff01;怎么就这么复杂&#xff01; 曾几何时&#xff0c;在网上找个网页…

一文了解【完全合作关系】下的【多智能体强化学习】

处于完全合作关系的多智能体的利益一致&#xff0c;获得的奖励相同&#xff0c;有共同的目标。比如多个工业机器人协同装配汽车&#xff0c;他们的目标是相同的&#xff0c;都希望把汽车装好。 在多智能体系统中&#xff0c;一个智能体未必能观测到全局状态 S。设第 i 号智能体…

汽车芯片「新变量」

编者按&#xff1a;汽车行业的格局重构和技术革新&#xff0c;也在推动芯片赛道进入变革周期。不同商业模式的博弈&#xff0c;持续升温。 对于智能汽车来说&#xff0c;过去几年经历了多轮硬件和软件的性能迭代&#xff0c;甚至是革新&#xff0c;如今&#xff0c;市场正在进…

FPGA引脚物理电平(内部资源,Select IO)-认知2

引脚电平 The SelectIO pins can be configured to various I/O standards, both single-ended and differential. • Single-ended I/O standards (e.g., LVCMOS, LVTTL, HSTL, PCI, and SSTL) • Differential I/O standards (e.g., LVDS, Mini_LVDS, RSDS, PPDS, BLVDS, and…

网络信号避雷器综合行业应用方案

一、网络信号避雷器的概念和作用 网络信号避雷器&#xff08;信号浪涌保护器&#xff09;是一种专业用于保护网络、通讯、光缆、广播、电视、监控、视频等信号设备的雷电保护设备。它的功能是在雷电或其他电磁干扰产生的高压电涌进入信号线路时&#xff0c;将其迅速引导至地&a…

STM32-调用 vTaskStartScheduler API 后出现 HardFault

STM32 移植 FreeRTOS 后调用 vTaskStartScheduler() 后出现 HardFault 异常。 原因分析&#xff1a; FreeRTOS 配置头文件 FreeRTOSConfig.h 中与中断有关的配置和通过系统接口 void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) 设置的中断分组冲突。 /* The lo…

微信小程序(六)tabBar的使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1. 标签栏文字的内容以及默认与选中颜色 2. 标签栏图标的默认样式与选中样式 3. 标签选项路径页面 4.标签栏背景颜色 &#x1f43c;&#xff08;文末补充&#xff09;设置标签栏后为什么navigator标签无法跳转页…

Java后端sql编写

Java后端sql编写 注意事项二级目录三级目录 注意事项 在后端编写sql&#xff0c;不要直接编写sql语句进行查询 比如直接在service实现类中写下图这种语句 二级目录 三级目录

适合进阶学习的 机器学习 开源项目(可快速下载)

目录 开源项目合集[>> 开源的机器学习平台&#xff1a;mlflow/mlflow](https://gitcode.com/mlflow/mlflow)[>> 机器学习路线图&#xff1a;mrdbourke/machine-learning-roadmap](https://gitcode.com/mrdbourke/machine-learning-roadmap)[>> 机器学习理论和…

JAVA电商平台 免 费 搭 建 B2B2C商城系统 多用户商城系统 直播带货 新零售商城 o2o商城 电子商务 拼团商城 分销商城

涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

如何用GPT进行数据分析?

详情点击链接&#xff1a;如何用GPT进行数据分析&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2 二定制自…

#LLMOps##AIGC# Dify_构建本地知识库问答应用-生成Al应用的创新引擎 用于构建助手API和GPT的开源开发平台

github&#xff1a; https://github.com/langgenius/dify/blob/main/README_CN.md 介绍文档&#xff1a;https://docs.dify.ai/getting-started/readme Dify 介绍 Dify 笔记 Dify 是什么&#xff1f; 开源的大语言模型&#xff08;LLM&#xff09;应用开发平台融合了后端即服…