当前位置: 首页 > news >正文

济南腾飞网络网站建设东莞网站建设地点优化

济南腾飞网络网站建设,东莞网站建设地点优化,云端互联网站建设,网站建设 会议纪要#x1f984;个人主页:修修修也 #x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个顺序栈: 该顺序栈使用动态内存分配空间,可以用来存储任意数量的同类型数据. 顺序栈结构体需要包含三个要素:存放数据的数组… 个人主页:修修修也 所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个顺序栈: 该顺序栈使用动态内存分配空间,可以用来存储任意数量的同类型数据. 顺序栈结构体需要包含三个要素:存放数据的数组arr,栈顶元素下标top,栈容量capacity. 顺序栈程序提供的功能有: 顺序栈的初始化顺序栈的销毁顺序栈的入栈顺序栈的出栈顺序栈的长度顺序栈判空顺序栈取栈顶元素 二.项目功能演示 要编写一个顺序栈项目首先要明确我们想要达到的效果是什么样下面我将用vs2022编译器来为大家演示一下顺序栈程序运行时的样子 顺序栈的C语言实现 三.逐步实现项目功能模块及其逻辑详解 通过第二部分对项目功能的介绍我们已经对顺序栈的功能有了大致的了解虽然看似需要实现的功能很多貌似一时间不知该如何下手但我们可以分步分模块来分析这个项目的流程最后再将各部分进行整合所以大家不用担心跟着我一步一步分析吧 注意该部分的代码只是为了详细介绍某一部分的项目实现逻辑故可能会删减一些与该部分不相关的代码以便大家理解需要查看或拷贝完整详细代码的朋友可以移步本文第四部分。 1.实现顺序栈程序菜单 菜单部分的逻辑比较简单就是利用C语言printf函数打印出这个菜单界面即可。但要注意菜单的标序要和后续switch...case语句的分支相应,以免导致后续执行语句错乱的问题.基础问题就不过多赘述了代码如下 该部分功能实现代码如下:  void STMenu() {printf(**********************************\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(******0.退出顺序栈程序 ******\n);printf(**********************************\n);printf(请选择:);} 2.实现顺序栈程序功能可循环使用 由于我们要实现顺序栈的功能可以反复使用的逻辑且至少在一开始执行一次,因此我们选择do...while的循环语句来实现这一部分的逻辑. 该部分功能实现代码如下: int main() {ST st;STInit(st);int swi 0;//创建变量swi作为do...while循环的终止条件,以及switch语句的运行条件do //使用do...while实现{STMenu();scanf(%d, swi);switch (swi){case 0:STDestroy(st);printf(您已退出程序:\n);// 释放链表内存break;case 1:printf(请输入要入栈的数据:);STDataType pushback_data 0;scanf(%d, pushback_data);STPush(st, pushback_data);printf(已成功入栈:\n);break;case 2:printf(栈顶元素%d已成功出栈\n, STTop(st));STPop(st);break;case 3:printf(栈顶元素为:);STDataType sttop STTop(st);printf(%d\n, sttop);break;case 4:if (!STEmpty(st)){printf(当前栈不为空\n);}else{printf(当前栈为空栈\n);}break;case 5:printf(当前栈长为:);int stsize STSize(st);printf(%d\n, stsize);break;case 6:STDestroy(st);STInit(st);printf(顺序栈已清空:\n);break;case 7:STDestroy(st);printf(顺序栈已销毁:\n);break;default:printf(输入错误,请重新输入\n);break;}} while (swi);return 0; } 3.创建顺序栈 创建顺序栈成员的结构体应该包括:存放数据的数组arr,栈顶元素下标top,栈容量capacity. 因此我们创建Stack结构体类型时应由一个数组及两个整型组成. 这里的第9行使用的typedef类定义的作用是方便我们后续在使用顺序栈时对存储的数据类型做更改,比如后续我们不想存储int类型数据了,就可以很方便的在这里对数组类型做更改.比如改成char类型,或者double类型,甚至改成任意自己构造的结构类型. 综上,该部分代码如下: #define _CRT_SECURE_NO_WARNINGS 1 #pragma once#includestdio.h #includestdlib.h #includestdbool.h #includeassert.htypedef int STDataType;typedef struct Stack {int *arr;int top;int capacity; }ST; 4.初始化顺序栈 初始化顺序栈的逻辑和初始化顺序表一样,我们在初始化时为栈开辟4个数据类型的数组空间,然后将顺序栈的容量改为4,栈顶置为0即可. 该部分的功能实现代码如下: void STInit(ST* ps) {assert(ps);ps-arr (STDataType*)malloc(sizeof(STDataType) * 4);if (ps-arr NULL){perror(malloc fail::\n);return;}ps-capacity 4;ps-top 0; //top表示栈顶元素的下一个//top指向栈顶元素的话,top给-1} 5.顺序栈的入栈 顺序栈在入栈时,需要先判断一下栈内元素是否已满,如果满了则需要给栈扩容.(如下代码5-18行均是在执行顺序栈查满扩容逻辑) 如果没满则将新元素赋值给栈顶指针top,再将top,使其始终指向栈顶的下一个元素位置. 该部分的功能实现代码如下:  void STPush(ST* ps, STDataType x) {assert(ps);if (ps-top ps-capacity)//扩容{STDataType* tmp (STDataType*)realloc(ps-arr, sizeof(STDataType) * ps-capacity * 2);if (tmp NULL){perror(realloc fail::\n);return;}ps-arr tmp;ps-capacity * 2;}ps-arr[ps-top] x;ps-top;} 6.顺序栈的出栈 顺序栈的出栈就相当于顺序表的尾删,那么我们同顺序表一样移动栈顶下标位置即可. 顺序表尾删示意图: 该部分的功能实现代码如下:  void STPop(ST* ps) {assert(ps);assert(!STEmpty(ps));ps-top--; } 7.顺序栈取栈顶元素 根据我们之前的设定,栈为空时top0: 那么当栈中进入一个元素时,top后top1,而栈顶元素a1的下标等于0,所以我们的top设计其实是指向栈顶元素的下一个位置的: 因此在取栈顶函数中,我们要返回的栈顶数组下标应该是top-1. 该部分的功能实现代码如下:  STDataType STTop(ST* ps) {assert(ps);assert(!STEmpty(ps));return ps-arr[ps-top - 1]; } 8.顺序栈的长度 因为top指向的是栈顶元素的下一个位置,因此top的大小正好是栈的长度,所以求栈长函数我们对ps断言后可以直接返回top. 该部分的功能实现代码如下: int STSize(ST* ps) {assert(ps);return ps-top; } 9.顺序栈的判空 顺序栈判空的逻辑是:如果栈为空返回true(真),否则返回false(假). 因此我们还是拿top来判断,如果top0,会return true,意味着栈为空. 否则会return false,意味着栈不为空. 该部分的功能实现代码如下: bool STEmpty(ST* ps)//判空,为空则真 {assert(ps);return ps-top0; } 10.顺序栈的销毁 当我们使用完顺序栈想要退出程序时,就应该将之前动态开辟的内存释放掉,还给操作系统.即销毁顺序栈. 我们使用free()函数释放掉之前动态开辟的数组arr,然后将arr置为空指针,最后将top,capacity的值置为0即可. 该部分的功能实现代码如下: void STDestroy(ST* ps) {assert(ps);free(ps-arr);ps-arr NULL;ps-top 0;ps-capacity 0;} 四.项目完整代码 我们将程序运行的代码分别在三个工程文件中编辑,完整代码如下: test.c文件 #includeStack.hint main() {ST st;STInit(st);int swi 0;//创建变量swi作为do...while循环的终止条件,以及switch语句的运行条件do //使用do...while实现{STMenu();scanf(%d, swi);switch (swi){case 0:STDestroy(st);printf(您已退出程序:\n);// 释放链表内存break;case 1:printf(请输入要入栈的数据:);STDataType pushback_data 0;scanf(%d, pushback_data);STPush(st, pushback_data);printf(已成功入栈:\n);break;case 2:printf(栈顶元素%d已成功出栈\n, STTop(st));STPop(st);break;case 3:printf(栈顶元素为:);STDataType sttop STTop(st);printf(%d\n, sttop);break;case 4:if (!STEmpty(st)){printf(当前栈不为空\n);}else{printf(当前栈为空栈\n);}break;case 5:printf(当前栈长为:);int stsize STSize(st);printf(%d\n, stsize);break;case 6:STDestroy(st);STInit(st);printf(顺序栈已清空:\n);break;case 7:STDestroy(st);printf(顺序栈已销毁:\n);break;default:printf(输入错误,请重新输入\n);break;}} while (swi);return 0; } Stack.c 文件 #includeStack.hvoid STInit(ST* ps) {assert(ps);ps-arr (STDataType*)malloc(sizeof(STDataType) * 4);if (ps-arr NULL){perror(malloc fail::\n);return;}ps-capacity 4;ps-top 0; //top表示栈顶元素的下一个//top指向栈顶元素的话,top给-1}void STDestroy(ST* ps) {assert(ps);free(ps-arr);ps-arr NULL;ps-top 0;ps-capacity 0;}void STPush(ST* ps, STDataType x) {assert(ps);if (ps-top ps-capacity)//扩容{STDataType* tmp (STDataType*)realloc(ps-arr,sizeof(STDataType)*ps-capacity*2);if (tmp NULL){perror(realloc fail::\n);return;}ps-arr tmp;ps-capacity * 2;}ps-arr[ps-top] x;ps-top;}void STPop(ST* ps) {assert(ps);assert(!STEmpty(ps));ps-top--; }int STSize(ST* ps) {assert(ps);return ps-top; }bool STEmpty(ST* ps)//判空,为空则真 {assert(ps);return ps-top0; }STDataType STTop(ST* ps) {assert(ps);assert(!STEmpty(ps));return ps-arr[ps-top - 1]; }void STMenu() {printf(**********************************\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(******0.退出顺序栈程序 ******\n);printf(**********************************\n);printf(请选择:); } Stack.h文件 #define _CRT_SECURE_NO_WARNINGS 1 #pragma once#includestdio.h #includestdlib.h #includestdbool.h #includeassert.htypedef int STDataType;typedef struct Stack {int *arr;int top;int capacity; }ST;void STInit(ST* ps); void STDestroy(ST* ps);void STPush(ST* ps, STDataType x); void STPop(ST* ps);int STSize(ST* ps);bool STEmpty(ST* ps);//判空,为空则真STDataType STTop(ST* ps);void STMenu(); 结语 希望这篇顺序栈的C语言实现详解能对大家有所帮助,欢迎大佬们留言或私信与我交流. 学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步! 相关文章推荐 【数据结构】什么是栈? 【数据结构】C语言实现顺序表万字详解(附完整运行代码) 【数据结构】C语言实现单链表万字详解(附完整运行代码) 【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码) 【实用编程技巧】不想改bug?初学者必须学会使用的报错函数assert!(断言函数详解) 数据结构栈与队列篇思维导图:
http://www.yayakq.cn/news/1092/

相关文章:

  • 注册个网站怎么注册东营会计信息网官网首页
  • 什么网站可以做高三英语试题客户做网站要退款
  • 做网站怎么做推广石狮app网站开发
  • windows优化大师官网贵阳关键词优化平台
  • 校园网站建设情况wordpress 密码爆破
  • 两学一做网站条幅小说网站设计模板
  • 制作公司网站怎样收费中国建筑有几个工程局
  • 可以做代发货源的网站国内做交互网站
  • 山东网站建设哪家权威icp备案网站接入信息 ip地址段
  • 口碑好的网站建设商家用wordpress还是php
  • phpcms网站模板下载徐州网站建设 网站制作
  • 网站建设家乡网页设计模板网上注册公司需要什么材料和手续
  • 做网站能成功吗wordpress网站很慢
  • 浙江中联建设集团网站wordpress 没有中文
  • 建设中网站如何上传图片网页设计公司兴田德润在那里
  • 建商城网站需要什么条件制作网站得多少钱
  • 企业建站用什么软件杭州python做网站
  • 网站备案号找回密码国外ip地址怎么弄
  • 哪个网站容易做二级域名建网站用什么系统
  • 广州电子商务网站建设费用女同wordpress
  • 美团网站界面设计网站招聘怎么做
  • 免费的个人空间建网站网站开发网页权限如何控制
  • 中旅远洋商务网站建设策划书免费收录软文网站
  • wordpress 导航网站无二制造 网站升级建设中
  • wordpress注册模板下载seo关键词快速排名软件
  • 深圳做网站de公司优化网站做什么的
  • 建设教育网站法律网站的建设流程
  • app网站建设宣传方案怎么查网站建设时间
  • 八宝山做网站的公司家装公司十大口碑排名
  • 建设网站有哪些步骤网站空间查询