数据结构之栈的基本操作

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

#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.hqwc.cn/news/414430.html

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

相关文章

故事机手机平板等智能硬件DVT阶段可靠性测试方法

DVT是什么 DVT是设计样品验证测试评审阶段&#xff0c;这个阶段要进行全面的&#xff0c;客观的测试&#xff0c; 主要测试项目包括&#xff1a;功能测试&#xff0c;安规测试&#xff0c;性能测试&#xff0c;合规测试&#xff08;兼容性&#xff09;&#xff0c;机械测试&am…

【信号与系统】【北京航空航天大学】实验四、幅频、相频响应和傅里叶变换

一、实验目的 1、 掌握利用MATLAB计算系统幅频、相频响应的方法&#xff1b; 2、 掌握使用MATLAB进行傅里叶变换的方法&#xff1b; 3、 掌握使用MATLAB验证傅里叶变换的性质的方法。 二、实验内容 1、 MATLAB代码&#xff1a; >> clear all; >> a [1 3 2]; …

【Flink-1.17-教程】-【三】Flink 运行架构、Flink 核心概念【并行度、算子链、任务槽】、Flink 作业提交流程

【Flink-1.17-教程】-【三】Flink 运行架构、Flink 核心概念【并行度、算子链、任务槽】、Flink 作业提交流程 1&#xff09;系统架构1.1.系统成员组成1.2.作业提交流程 2&#xff09;核心概念2.1. 并行度&#xff08;Parallelism&#xff09;2.1.1.并行子任务和并行度2.1.2.并…

为什么要选择“零代码”开发的智慧能源管理平台?

全球低代码市场发展较早&#xff0c;集中度逐渐凸显&#xff0c;零代码市场尙未形成市场格局&#xff0c;很多企业出现“业务部门不懂技术&#xff0c;技术部门不懂业务”的现象往往会制约软件的开发进度&#xff0c;如何快速搭建软件系统应用&#xff0c;助力业务增长与效率提…

navigateTo失效-跳转不了页面解决办法!uniapp\vue

改了一个小时多的错误&#xff0c;跳转页面无论怎么样都跳转不了&#xff0c;有2个问题&#xff1a; 注意&#xff1a;uniapp的报错可以在console里检查&#xff01; 1.pages.json文件没有配置路径&#xff0c; 在pages:[ ]里面加 &#xff08;根据自己的路径进行修改 {&qu…

Flask 项目怎么配置并创建第一个小项目?附上完成第一个小案例截图

目录 1. 为什么要学习 flask&#xff1f; 2. flask 是什么&#xff1f; 3. flask 如何使用&#xff1f; 要安装 Flask&#xff0c;可以按照以下步骤进行&#xff1a; 4. 使用流程 4.1. 新建项目 4.1.1. 打开 pycharm&#xff0c;新建项目 4.1.2. 设置目录&#xff0c;并…

elastic search入门

参考1&#xff1a;Elastic Search 入门 - 知乎 参考2&#xff1a;Ubuntu上安装ElasticSearch_ubuntu elasticsearch-CSDN博客 1、ElasticSearch安装 1.1安装JDK&#xff0c;省略&#xff0c;之前已安装过 1.2创建ES用户 创建用户&#xff1a;sudo useradd esuser 设置密码&…

ICCV2023 | PTUnifier+:通过Soft Prompts(软提示)统一医学视觉语言预训练

论文标题&#xff1a;Towards Unifying Medical Vision-and-Language Pre-training via Soft Prompts 代码&#xff1a;https://github.com/zhjohnchan/ptunifier Fusion-encoder type和Dual-encoder type。前者在多模态任务中具有优势&#xff0c;因为模态之间有充分的相互…

CentOS 8.5 安装图解

特特特别的说明 CentOS发行版已经不再适合应用于生产环境&#xff0c;客观条件不得不用的话&#xff0c;优选7.9版本&#xff0c;8.5版本次之&#xff0c;最次6.10版本&#xff08;比如说Oracle 11GR2就建议在6版本上部署&#xff09;&#xff01; 引导和开始安装 选择倒计时结…

Spring使用注解管理Bean

引入lib包 Spring对Bean管理的常用注解 Component组件(作用在类上) Spring中提供了Component的三个衍生注解:(功能在目前为止是一致的) Controller WEB层 Service 业务层 Repository 持久层 属性注入的注解:(使用注解注入的方式,可以不用提供set方法) Value 用于注入普…

看透繁花,六大经典台词另有深意

&#xff08;图源&#xff1a;《繁花》官方微博&#xff09; 大火的《繁花》&#xff0c;大家看了吗&#xff1f; 变迁的时代&#xff0c;裹挟着市井万象&#xff0c;多舛的命运&#xff0c;缩影了“繁花“时代向前的潮涌潮落。 同在变革的大潮&#xff0c;《繁花》里“上帝…

allegro画PCB如何设置原点

如上图&#xff0c;然后鼠标点击那里&#xff0c;原点就在哪&#xff0c;如果那个位置点不上&#xff0c;就可能超出了你底板的范围&#xff0c;需要设置加大底板面积&#xff0c;设置底板大小的方法如下&#xff1a; 链接: link