数据结构与算法学习笔记六---栈的顺序表示和实现(C语言)

目录

前言

一、什么是顺序栈

二、顺序栈的表示和实现

1.初始化

2.销毁

3.清空

4.栈空

5.栈长度

6.栈顶元素

7.入栈

8.出栈

8.遍历栈

9.测试代码


前言

    这篇文章主要讲栈的顺序表示和实现。

一、什么是顺序栈

        顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针 top 指示栈顶元素在顺序栈中的位置。通常的习惯做法是以 top=0 表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C作描述语言时,如此设定会带来很大不便;另一方面,由于栈在使用过程中所需最大空间的大小很难估计因此,一般来说,在初始化设空栈时不应限定栈的最大容量。一个较合理的做法是:先为栈分配一个基本容量,然后在应用过程中,当栈的空间不够使用时再逐段扩大。

        因此设定两个常量:STACK_INIT_SIZE(存储空间初始分配量)和 STACKINCREMENT(存储空间分配增量),并以下述类型说明作为顺序栈的定义。
        顺序栈的定义如下:

#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10   // 存储空间分配增量
#define ElementType int
typedef int Status;typedef struct{ElementType * base;// 栈底指针ElementType * top; // 栈顶指针int stacksize; // 栈的当前可以使用的最大容量
}SeqStack;

二、顺序栈的表示和实现

1.初始化

        初始化顺序栈,分配存储空间。

Status initSqStack(SqStack *sqStack){sqStack->base = (ElementType *)malloc(sizeof(ElementType) * STACK_INIT_SIZE);if (!sqStack->base) {return 0;}sqStack->top = sqStack->base;sqStack->stacksize = STACK_INIT_SIZE;return 1;
}

2.销毁

        释放栈的存储空间,置空栈顶和栈底。

// 如果栈存在,销毁栈
void destroySqStack(SqStack *sqStack){free(sqStack->base);//释放栈基址的存储空间sqStack->base = sqStack->top = NULL;//栈顶和栈底置空sqStack->stacksize = 0;//栈大小置零
}

3.清空


void clearSqStack(SqStack * sqStack){sqStack->top = sqStack->base;
}

4.栈空

// 栈空
Status sqStackEmpty(SqStack *sqStack){return sqStack->top == sqStack->base;
}

5.栈长度

// 栈的长度
int sqStackLength(SqStack * sqStack){return (int)(sqStack->top - sqStack->base);
}

6.栈顶元素

// 获取栈顶元素
Status getSqStackTop(SqStack * sqStack,int *element){if (sqStack->top == sqStack->base) {return 0;}*element = *(sqStack->top - 1);return 1;
}

7.入栈

// 入栈
Status pushSqStack(SqStack *sqStack, ElementType element) {if (sqStack->top - sqStack->base >= sqStack->stacksize) { // 栈满sqStack->base = (ElementType *)realloc(sqStack->base, (sqStack->stacksize + STACKINCREMENT) * sizeof(ElementType));if (!sqStack->base) {return 0;}sqStack->top = sqStack->base + sqStack->stacksize; // 更新栈顶指针位置sqStack->stacksize = sqStack->stacksize + STACKINCREMENT;}*sqStack->top++ = element;return 1;
}

8.出栈

// 出栈
Status popSqStack(SqStack * sqStack,int * element){if (sqStack->top == sqStack->base) {//栈空return 0;}*element = * (--sqStack->top);return 1;
}

8.遍历栈

void traverseSqStack(SqStack * sqStack) {if (sqStackEmpty(sqStack)) {printf("栈为空\n");return;}int *p = sqStack->base;while (p < sqStack->top) {printf("%d\t", *p++);}printf("\n");
}

9.测试代码

#include <stdlib.h>
#include <stdio.h>#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10   // 存储空间分配增量
#define ElementType int
typedef int Status;typedef struct{ElementType * base;// 栈底指针ElementType * top; // 栈顶指针int stacksize; // 栈的当前可以使用的最大容量
}SqStack;
Status initSqStack(SqStack *sqStack){sqStack->base = (ElementType *)malloc(sizeof(ElementType) * STACK_INIT_SIZE);if (!sqStack->base) {return 0;}sqStack->top = sqStack->base;sqStack->stacksize = STACK_INIT_SIZE;return 1;
}// 如果栈存在,销毁栈
void destroySqStack(SqStack *sqStack){free(sqStack->base);//释放栈基址的存储空间sqStack->base = sqStack->top = NULL;//栈顶和栈底置空sqStack->stacksize = 0;//栈大小置零
}void clearSqStack(SqStack * sqStack){sqStack->top = sqStack->base;
}// 栈空
Status sqStackEmpty(SqStack *sqStack){return sqStack->top == sqStack->base;
}// 栈的长度
int sqStackLength(SqStack * sqStack){return (int)(sqStack->top - sqStack->base);
}// 获取栈顶元素
Status getSqStackTop(SqStack * sqStack,int *element){if (sqStack->top == sqStack->base) {return 0;}*element = *(sqStack->top - 1);return 1;
}// 入栈
Status pushSqStack(SqStack *sqStack, ElementType element) {if (sqStack->top - sqStack->base >= sqStack->stacksize) { // 栈满sqStack->base = (ElementType *)realloc(sqStack->base, (sqStack->stacksize + STACKINCREMENT) * sizeof(ElementType));if (!sqStack->base) {return 0;}sqStack->top = sqStack->base + sqStack->stacksize; // 更新栈顶指针位置sqStack->stacksize = sqStack->stacksize + STACKINCREMENT;}*sqStack->top++ = element;return 1;
}// 出栈
Status popSqStack(SqStack * sqStack,int * element){if (sqStack->top == sqStack->base) {//栈空return 0;}*element = * (--sqStack->top);return 1;
}void traverseSqStack(SqStack * sqStack) {if (sqStackEmpty(sqStack)) {printf("栈为空\n");return;}int *p = sqStack->base;while (p < sqStack->top) {printf("%d\t", *p++);}printf("\n");
}void testStack(void){SqStack sqStack;printf("栈初始化中...\n");if (initSqStack(&sqStack)) {printf("栈初始化成功\n");}else{printf("栈初始化失败\n");}printf("入栈...\n");if (pushSqStack(&sqStack, 1)) {printf("入栈成功\n");}if (pushSqStack(&sqStack, 2)) {printf("入栈成功\n");}if (pushSqStack(&sqStack, 3)) {printf("入栈成功\n");}printf("栈中元素:\n");traverseSqStack(&sqStack);printf("栈的长度:%d\n",sqStackLength(&sqStack));if (!sqStackEmpty(&sqStack)) {printf("栈不为空\n");}int top;if (getSqStackTop(&sqStack, &top)) {printf("栈顶元素获取成功\n");}printf("栈顶元素:%d\n",top);//出栈测试int element;if (popSqStack(&sqStack, &element)) {printf("出栈成功,出栈元素为:%d\n",element);}if (popSqStack(&sqStack, &element)) {printf("出栈成功,出栈元素为:%d\n",element);}if (popSqStack(&sqStack, &element)) {printf("出栈成功,出栈元素为:%d\n",element);}printf("栈的长度:%d\n",sqStackLength(&sqStack));if (sqStackEmpty(&sqStack)) {printf("栈为空\n");}destroySqStack(&sqStack);
}

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

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

相关文章

CPU的的处理流程如何快速记忆

为了快速记忆CPU的处理流程&#xff0c;可以将其简化成五个主要阶段&#xff0c;通常称为“冯诺依曼架构”的五个基本步骤&#xff0c;或者是流水线处理的几个阶段。下面是一种便于记忆的简化版本&#xff1a; CPU处理流程的五个阶段&#xff1a; 取指令&#xff08;Instructi…

将视觉语言模型训练为智能手机助手

24年4月Agile Loop和德国弗赖堡大学的论文“Training A Vision Language Model As Smartphone Assistant”。 为了解决能够执行各种用户任务的数字助理挑战&#xff0c;该研究重点是基于指令的移动设备控制域。 用大语言模型 (LLM) 的最新进展&#xff0c;本文提出一种可以在移…

免费思维13招之十:增值型思维

免费思维13招之十:增值型思维 免费思维的另一大战略思维——增值型思维。 为了提高客户的粘性而促进重复性消费,我们必须对客户进行免费的增值型服务。 大家不要把增值型思维与赠品型思维混淆,增值型思维重心在于提高与消费者的粘性而促进重复消费,重心在后端。而赠品型思…

2024最新独立版校园跑腿校园社区小程序源码+附教程 适合跑腿,外卖,表白,二手,快递等校园服务

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 后台php&#xff0c;前端uniapp可以二次开 2024最新独立版校园跑腿校园社区小程序源码附教程 测试环境&#xff1a;NginxPHP7.2MySQL5.6 多校版本&#xff0c;多模块&#xff0c;适…

设计模式-11 - Bridge Method 桥接模式

设计模式-11 - Bridge Method 桥接模式 1.定义 桥接模式是一种设计模式&#xff0c;它将抽象部分与其实现部分分离&#xff0c;使它们可以独立变化。它允许你改变抽象部分和实现部分的实现&#xff0c;而无需更改它们的接口。 结构&#xff1a; 桥接模式涉及四个主要角色&…

从iconfont引入线上字体库

如果是长期使用建议直接下载字体包 /* 在线链接服务仅供平台体验和调试使用&#xff0c;平台不承诺服务的稳定性&#xff0c;企业客户需下载字体包自行发布使用并做好备份。 */ 例如使用阿里妈妈数黑体 https://www.iconfont.cn/fonts/detail?spma313x.fonts_index.i1.d9df…

手动加载PE文件

今天手撸一下加载PE文件&#xff0c;并执行加载的PE文件。看完这一节之后相信大家会对PE文件的结构和在内存中的加载顺序有一个比较深刻的理解。 本文中可能对PE文件的基础知识介绍的不是很详细&#xff0c;建议大家先看看PE文件的基础结构&#xff0c;了解了这些基础知识后再看…

数据库面试总结

数据库相关 mysql使用的函数 字符相关: concant() 连接字符 trim()去除字符的首尾空格 space(n) 返回n个空格 char_length() 返回字符的个数 ucase()/upper()将字符串 s 的所有字母变成大写字母 lcase()/lower() 将字符串 s 的所有字母变成小写字母 substr/substring/mid(s, …

第十五章 数据管理成熟度评估练习

单选题 (每题1分,共19道题) 1、 [单选] 下列选项中属于数据管理成熟度2级特征的选项是? A:很少或没有治理;有限的工具集;单个竖井(系统)内定义角色;控件(如果有的话的应用完全不一致);未解决的数据质量问题 B:治理开始出现;引入一致的工具集;定义了一些角色和…

杂记-记一次前端打包问题解决过程

背景 若干年没更新发布的前端项目&#xff0c;突然来了个小需求&#xff0c;需求完成耗时5min&#xff0c;打包问题解决2小时 问题 error commander12.0.0: The engine “node” is incompatible with this module. Expected version “>18”. Got “10.22.1” 这个错误…

卷积神经网络边缘识别

为什卷积神经网络能够识别图片呢&#xff1f;是基于图片相似度比较&#xff0c;两张图片的点击越大说明两张图片越像&#xff0c;比如我们那狗胡子的图片去比较&#xff0c;如果相似度很高&#xff0c;就是认为这个动物更像狗。点积越大&#xff0c;图片越相似&#xff0c;这个…

vivado Virtex UltraScale 配置存储器器件

Virtex UltraScale 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Virtex UltraScale ™ 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列非易失…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (六)

LlaMA 3 系列博客 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (三) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (四) 基于 LlaMA…

第三课,python基础语法(二),基本算术运算符、3种数据类型、变量命名规则

一&#xff0c;基本算术运算 数学中&#xff1a;&#xff0c;-&#xff0c;&#xff0c; *小练习 请在程序中&#xff0c;定义如下变量&#xff1a; 钱包余额(变量名&#xff1a;money)&#xff0c;初始余额50 请通过程序计算&#xff0c;再购买了&#xff1a; 冰淇淋10元可…

微信小程序、uniapp密码小眼睛

直接上代码喔喔喔喔喔喔喔喔~~ <input name"username" password"{{passwordHideShow}}" placeholder-style"color:#bdbdbd" type"text"maxlength"20" value"{{passwordNumber}}" bindinput"passwordInput…

荷香堪筑梦,鸳鸯和月寻。(变相BFS搜索)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 3 4 2 .... ***. ..a. 输出 yes 思路&#xff1a; 根据题意&#xff0c;这里 1 s 可以移动多次&#xff0c;我们将每次可以移动避开雪的的位置存储起来&#xff0c;判断当…

randperm函数打乱索引的用法

randperm&#xff0c;用于生成一个随机排列。这个函数可以被用于许多需要随机排列的情况&#xff0c;如数据集的划分、模型的训练等等。通过randperm函数&#xff0c;你可以得到一个随机的、不重复的排列。 下面是randperm函数的一些用法示例&#xff1a; 1. 生成一个长度为n…

地埋式可燃气体监测终端,地下燃气管网安全“哨兵”

在现代都市的繁华之下&#xff0c;一条条地下燃气管网承载着城市的生命与活力&#xff0c;但管网老化腐蚀&#xff0c;第三方施工破坏&#xff0c;巡检维修不到位等问题&#xff0c;时刻影响着燃气管网安全运行&#xff0c;甚至威胁人民群众的生命财产安全。 为实现对燃气管网…

实现一个拆分实数的整数和小数部分的函数指针

#include <stdio.h> // 定义常量 #define LARGE_NUMBER 1000000000 // 定义一个常量&#xff0c;方便后续使用 void splitFloatIntoParts(float x, int *intpart, float *fracpart); // 声明一个分割浮点数为整数和小数部分的函数 int main() // 主函数开始 { …

轻松寄快递,推荐一款寄快递优惠的小程序!

不管我们经不经常寄快递&#xff0c;我们总是要处理寄快递收快递的事情&#xff0c;可是我们不想这么麻烦来处理寄快递的事情&#xff0c;怎么办呢&#xff1f;这里推荐大家使用闪侠惠递来寄快递&#xff0c;因为使用闪侠惠递寄快递&#xff0c;不仅是带给你便宜的寄快递价格&a…