栈的解释和实现

目录

1.栈的基本概念:

2. 栈的基本功能:

3.栈的实现:

3.1 存储结构:(顺序表)

3.2 初始化:(void StackInit(stack*tmp))

3.3 栈的销毁:(void StackDestroy(stack*tmp))

3.4 入栈:(void StackPush(stack*tmp,StackDataType x))

3.5 出栈:(void StackPop(stack*tmp))

4.实现代码:


1.栈的基本概念:

栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的数据结构。在栈中,元素的添加和移除都发生在同一端,这一端通常被称为栈顶(Top)。栈底(Bottom)是栈的另一端,通常元素不会从栈底添加或移除。

2. 栈的基本功能:

StackInit(Stack*tmp): 栈的初始化

StackPush(Stack*tmp,StackDataType x): 入栈

StackPop(Stack*tmp): 出栈

StackEmpty(Stack*tmp): 判空

StackDestroy(Stack*tmp): 栈的销毁

3.栈的实现:

使用链表和顺序表都能实现栈,考虑到栈后进先出的特性,使用顺序表更方便实现栈的功能

3.1 存储结构:(顺序表)

// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* _a;int _top;		// 栈顶int _capacity;  // 容量 
}Stack;

3.2 初始化:(void StackInit(stack*tmp))

初始化栈,将栈顶和容量都设置为0

// 初始化栈 
void StackInit(Stack* ps) {assert(ps);ps->_a = NULL;ps->_capacity = ps->_top = 0;
}

3.3 栈的销毁:(void StackDestroy(stack*tmp))

释放栈占用的内存,并将栈的指针、容量和栈顶都重置为0

// 销毁栈 
void StackDestroy(Stack* ps) {assert(ps);free(ps->_a);ps->_a = NULL;ps->_capacity = ps->_top = 0;
}

3.4 入栈:(void StackPush(stack*tmp,StackDataType x))

当栈满时,将容量加倍(当栈不为空时)或初始化为4(当栈为空时)

//入栈
void StackPush(Stack* ps, STDataType data) {assert(ps);if (ps->_capacity == ps->_top) {int newcapacity = StackEmpty(ps) ? 4 : 2 * ps->_capacity;STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));if (tmp == NULL) {perror("StackPush:realloc");return;}ps->_a = tmp;ps->_capacity = newcapacity;}ps->_a[ps->_top] = data;ps->_top++;
}

3.5 出栈:(void StackPop(stack*tmp))

将栈顶指针下移,并不释放内存

// 出栈 
void StackPop(Stack* ps) {assert(ps);ps->_top--;
}

4.实现代码:

实现一个支持动态增长的栈,其使用动态内存分配(通过mallocrealloc)来根据需要扩展栈的容量。当栈满时,它会将容量加倍(当栈不为空时)或初始化为4(当栈为空时)。此外,代码还包含了栈的初始化、入栈、出栈、获取栈顶元素、获取栈的大小、检测栈是否为空以及销毁栈等操作。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* _a;int _top;		// 栈顶int _capacity;  // 容量 
}Stack;
// 初始化栈 
void StackInit(Stack* ps) {assert(ps);ps->_a = NULL;ps->_capacity = ps->_top = 0;
}
// 入栈 
int StackEmpty(Stack* ps);
void StackPush(Stack* ps, STDataType data) {assert(ps);if (ps->_capacity == ps->_top) {int newcapacity = StackEmpty(ps) ? 4 : 2 * ps->_capacity;STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));if (tmp == NULL) {perror("StackPush:realloc");return;}ps->_a = tmp;ps->_capacity = newcapacity;}ps->_a[ps->_top] = data;ps->_top++;
}
// 出栈 
void StackPop(Stack* ps) {assert(ps);ps->_top--;
}
// 获取栈顶元素 
STDataType StackTop(Stack* ps) {return ps->_a[ps->_top - 1];
}
// 获取栈中有效元素个数 
int StackSize(Stack* ps) {return ps->_top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps) {assert(ps);if (ps->_top == 0) {return 1;}return 0;
}
// 销毁栈 
void StackDestroy(Stack* ps) {assert(ps);free(ps->_a);ps->_a = NULL;ps->_capacity = ps->_top = 0;
}

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

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

相关文章

ObjectiveC-第一部分-基础入门-学习导航

专题地址:MacOS一站式程序开发系列专题 第一部分:基础入门学习导航 OSX-01-Mac OS应用开发概述:简单介绍下MacOS生态、Xcode使用以及使用Xcode创建app的方法OSX-02-Mac OS应用开发系列课程大纲和章节内容设计:介绍下此系列专题的文章内容组织形式以及此系列专题的覆盖内容…

Midjourney简明教程 - 合集

Midjourney简明教程&#xff08;一&#xff09;&#xff1a;有关Midjourney的基本信息 AI绘画 绘画是人类一门很古老的艺术门类&#xff0c;人类通过实体的器具、画笔、颜色、颜料等反映客观世界和表达主观世界。 而AI绘画则是通过借助就计算机机器学习算法和模型来生成绘画…

Docker篇(三)— Docker的基本操作

目录 镜像操作镜像名称镜像命令案例1-拉取、查看镜像案例2-保存、导入镜像 镜像操作 镜像名称 首先来看下镜像的名称组成&#xff1a; 镜名称一般分两部分组成&#xff1a;[repository]:[tag]。在没有指定tag时&#xff0c;默认是latest&#xff0c;代表最新版本的镜像 如图…

便宜的ov ssl证书推荐

SSL证书是由正规证书颁发机构(CA)颁发的数字证书产品&#xff0c;它可以为网络中明文传输的数据增加一个安全套接层&#xff0c;佳明传输信息&#xff0c;还能对服务器身份进行认证&#xff0c;防止信息传输对象错误。OV企业型SSL证书是一种受到广泛认可的证书类型&#xff0c;…

代码随想录阅读笔记-回溯【分割回文串】

题目 给定一个字符串 s&#xff0c;将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ] 思路 本题这涉及到两个关…

OLAP引擎优缺点简单对比

总结&#xff1a; 数据压缩率Clickhouse好&#xff1b;ClickHouse单表查询性能优势巨大&#xff1b;Join查询两者各有优劣&#xff0c;数据量小情况下Clickhouse好&#xff0c;数据量大Doris好&#xff1b;Doris对SQL支持情况要好&#xff1b;

PHP婚恋小程序开发源码支持微信+公众号+APP

随着社会的发展和人们生活节奏的加快&#xff0c;传统的相亲方式已经不能满足现代人的需求。在此背景下&#xff0c;有人想到通过线上小程序的方式来满足更多的人进行相亲&#xff0c;所以在此情况下&#xff0c;婚恋相亲小程序由此出现。婚恋相亲小程序的功能有会员功能&#…

科技云报道:AI大模型疯长,存储扛住了吗?

科技云报道原创。 AI大模型正在倒逼数字基础设施产业加速升级。 过去一年半&#xff0c;AI大模型标志性的应用相继出现&#xff0c;从ChatGPT到Sora一次次刷新人们的认知。震撼的背后&#xff0c;是大模型参数指数级的增长。 这种数据暴涨的压力&#xff0c;快速传导到了大模…

Web前端-JavaScript

黑马程序员JavaWeb开发教程 文章目录 一、js引入方式1、内部脚本2、外部脚本 二、js基础语法1、书写语法&#xff08;1&#xff09;基本语法&#xff08;2&#xff09;输出语句 2、变量&#xff08;1&#xff09;变量&#xff08;2&#xff09;注意事项 3、数据类型、运算符、流…

利驰软件亮相第二届全国先进技术成果转化大会

4月8日&#xff0c;第二届全国先进技术成果转化大会在苏开幕。省长许昆林出席大会开幕式并致辞。国家国防科工局局长张克俭&#xff0c;省委常委、苏州市委书记刘小涛分别致辞。 本次转化大会由江苏省国防科学技术工业办公室、苏州市人民政府、先进技术成果长三角转化中心主办…

暴力破解密码自动阻断

1 re模块 re 模块是 Python 中用于正则表达式操作的模块。正则表达式&#xff08;Regular Expression&#xff09;是一种强大的文本处理工具&#xff0c;它使用一种特殊的字符序列来表示字符串中的模式&#xff0c;并可以通过模式匹配、查找、替换等操作对文本进行高效处理。 …

AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸?

AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸? 如下图所示,我们打开一份DWG格式的图纸文件,然后点击上方的“打印“图标, 如下图所示, 打印机/绘图仪这里选择“DWG To PDF“; 图纸尺寸:这里以普通的A4纸为例进行说明; 打印比例选择“布满图纸“; 打印偏移…