【数据结构】线性数据结构-顺序栈

栈(Stack)是一种基本的数据结构,具有以下特点:
后进先出(LIFO, Last In First Out):栈内的数据项遵循后进先出的原则,即最后存入的项最先被取出。
操作限制:栈通常只允许在一端进行插入和删除操作,这一端称为栈顶(Top),相对的另一端称为栈底(Bottom)。
应用场景:栈常用于解决函数调用、表达式求值、括号匹配等问题。
栈可以通过多种方式实现,常见的有基于数组的实现和基于链表的实现。无论哪种实现方式,都需要支持基本的栈操作如 push(入栈)、pop(出栈)、peek(查看栈顶元素)等。

①SqStack.h

#pragma once//预处理指令,防止头文件被重复包含
typedef int ElemType;
typedef struct {ElemType* elem;     // 存储空间的基址int top;    // 栈顶元素的下一个位置,简称栈顶位标int size;    // 当前分配的存储容量int increment;    // 扩容时,增加的存储容量
} SqStack;         // 顺序栈#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define TRUE 2
#define FALSE -2#define MAXSIZE 20
#define INCREMENT 5typedef int Status;Status InitStack_Sq(SqStack& S, int size, int inc);//初始化空顺序栈S
Status StackEmpty_Sq(SqStack S);//判断栈是否为空
Status Push_Sq(SqStack& S, ElemType e);//入栈操作
Status Pop_Sq(SqStack& S, ElemType& e);//出栈操作

②SqStack.cpp

实现栈的重要的四种基本操作

Status InitStack_Sq(SqStack& S, int size, int inc);//初始化空顺序栈S
Status StackEmpty_Sq(SqStack S);//判断栈是否为空
Status Push_Sq(SqStack& S, ElemType e);//入栈操作
Status Pop_Sq(SqStack& S, ElemType& e);//出栈操作

初始化顺序栈

首先为栈申请一块空间,如果申请失败,即没有足够的内存,返回OVERFLOW

申请成功,注意这里的S.top指向栈顶元素的下一个位置,S.top最先指向0号位置

同时,初始化栈的初始容量和可扩展的容量

Status InitStack_Sq(SqStack& S, int size, int inc) { // 初始化空顺序栈SS.elem = (ElemType*)malloc(size * sizeof(ElemType)); // 分配存储空间if (NULL == S.elem) return OVERFLOW;//分配失败S.top = 0;       // 置S为空栈S.size = size;  // 初始容量值S.increment = inc; // 初始增量值return OK;
}

栈的判空

没有任何元素的时候,栈顶指针指向0号位置,S.top==0

Status StackEmpty_Sq(SqStack S) { // 判断栈S是否空,若空则返回TRUE,否则FALSEif (0 == S.top)return TRUE;elsereturn FALSE;
}

入栈操作

首先,入栈后元素越来越多,有栈满的风险,因此第一步检查栈是否已满

栈的容量是S.size,从0号位置开始,因此存储到S.size-1的位置时栈已经满了,因为S.top指向栈顶元素的位置,即S.top==S.size时栈满。

栈满需要为栈分配空间,使用realloc函数分配更多的空间,同样要判断一下分配失败的情况

分配更大的内存后,要更新基址,同时容量增加了S.increment

入栈时,元素先入栈然后指针向后移,即先使用再加1,对应S.top++这种操作

Status Push_Sq(SqStack& S, ElemType e) { // 元素e压入栈SElemType* newbase;if (S.top >= S.size) { // 若栈顶位标已到达所分配的容量,则栈满,扩容newbase = (ElemType*)realloc(S.elem, (S.size + S.increment) * sizeof(ElemType));if (NULL == newbase) return OVERFLOW;//Add your code here: 调整S.elem和S.sizeS.elem = newbase;S.size += S.increment;}//Add your code here: e入栈,并将S.top加1S.elem[S.top++] = e;return OK;
}

出栈操作

首先,出栈后,元素越来越少,有栈空的风险,因此要先判断是否栈空

调用前面的 Status StackEmpty_Sq(SqStack S) 函数进行判断,栈空不能进行出栈,返回ERROR

出栈时,先取出里面的元素,然后指针向前移,先使用,后减的操作,对应S.top--

Status Pop_Sq(SqStack& S, ElemType& e) { // 栈顶元素出栈,赋给元素e//Add your code here:判断栈空if(StackEmpty_Sq(S)==TRUE)return ERROR;//Add your code here: e出栈,并将S.top减1e = S.elem[S.top-1];S.top--;return OK;
}

③Main.cpp

简单测试前面的接口是否有问题,没有问题的接口封装好就可以用于各种需要栈的场景里了

这里用于进制转换,我们手算进制转换,我们每次取余,直到该数变为0,我们发现先取的余数后被使用,符合栈“先进后出”的特点

#include <stdio.h>
#include "SqStack.h"void Conversion(int N) {SqStack S;ElemType e;InitStack_Sq(S, MAXSIZE, INCREMENT); // 栈S的初始容量为MAXSIZEwhile (N != 0){Push_Sq(S, N % 8);  // 将N除以8的余数入栈N /= 8;             // N取值为其除以8的商}while (TRUE != StackEmpty_Sq(S)){ // 依次输出栈中的余数Pop_Sq(S, e);printf("%d", e);}
}int main() {Conversion(1348);return 0;
}

 

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

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

相关文章

【yolo算法打架行为检测行人检测】

yolo打架行为检测 yolo算法打架行为检测yolo行人检测 yolo算法打架行为检测 数据集和模型YOLO算法打架行为检测数据集1万数据集 分两个类别&#xff1a;正常&#xff0c;打架行为&#xff1b; train: ../train/images val: ../valid/images test: ../test/images nc: 2 names…

一次RPC调用过程是怎么样的?

注册中心 RPC&#xff08;Remote Procedure Call&#xff09;翻译成中文就是 {远程过程调用}。RPC 框架起到的作用就是为了实现&#xff0c;调用远程方法时&#xff0c;能够做到和调用本地方法一样&#xff0c;让开发人员更专注于业务开发&#xff0c;不用去考虑网络编程等细节…

演示jvm锁存在的问题

文章目录 1、AlbumInfoApiController --》testLock()2、redis添加键值对3、AlbumInfoServiceImpl --》testLock() 没有加锁4、使用ab工具测试4.1、安装 ab 工具4.2、查看 redis 中的值 5、添加本地锁 synchronized6、集群情况下问题演示 jvm锁&#xff1a;synchronized lock 只…

尚品汇-H5移动端整合系统(五十五)

目录&#xff1a; &#xff08;1&#xff09;运行前端页面 &#xff08;2&#xff09;启动前端页面 &#xff08;3&#xff09;添加搜索分类接口 &#xff08;4&#xff09;购物车模块修改 &#xff08;5&#xff09;登录模块 &#xff08;6&#xff09;订单模块 &#…

Golang | Leetcode Golang题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; func originalDigits(s string) string {c : map[rune]int{}for _, ch : range s {c[ch]}cnt : [10]int{}cnt[0] c[z]cnt[2] c[w]cnt[4] c[u]cnt[6] c[x]cnt[8] c[g]cnt[3] c[h] - cnt[8]cnt[5] c[f] - cnt[4]cnt[7] c[s] - cnt[6]…

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL16

使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器 描述 ②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。 可将优先编码器Ⅰ的代码添加到本题答案中&#xff0c;并例化。 优先编码器Ⅰ的代码如下&#xff1a; module…

[python]从零开始的PySide安装配置教程

一、PySide是什么&#xff1f; PySide 是 Qt for Python 项目的一部分&#xff0c;它提供了与 PyQt 类似的功能&#xff0c;使开发者能够使用 Python 编程语言来构建基于 Qt 的图形用户界面 (GUI) 应用程序。PySide 是由 Qt 公司官方维护的&#xff0c;而 PyQt 则是由第三方开发…

【Pyside】pycharm2024配置conda虚拟环境

知识拓展 Pycharm 是一个由 JetBrains 开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它主要用于 Python 编程语言的开发。Pycharm 提供了代码编辑、调试、版本控制、测试等多种功能&#xff0c;以提高 Python 开发者的效率。 Pycharm 与 Python 的关系 Pycharm 是…

【JavaEE】——多线程(join阻塞,计算,引用,状态)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;join等待线程结束 1&#xff1a;知识回顾 2&#xff1a;join的功能就是“阻塞等待” …

java之斗地主部分功能的实现

今天我们要实现斗地主中发牌和洗牌这两个功能&#xff0c;该如何去实现呢&#xff1f; 1.创建牌类&#xff1a;52张牌每一张牌包含两个属性:牌的大小和牌的花色。 故我们优先创建一个牌的类(Card)&#xff1a;包含大小和花色。 public class Card { //单张牌的大小及类型/…

无人机+自组网:中继通信增强技术详解

无人机与自组网技术的结合&#xff0c;特别是通过中继通信增强技术&#xff0c;为无人机在复杂环境中的通信提供了稳定、高效、可靠的解决方案。以下是对该技术的详细解析&#xff1a; 一、无人机自组网技术概述 无人机自组网技术是一种利用无人机作为节点&#xff0c;通过无…

proteus仿真学习(1)

一&#xff0c;创建工程 一般选择默认模式&#xff0c;不配置pcb文件 可以选用芯片型号也可以不选 不选则从零开始布局&#xff0c;没有初始最小系统。选用则有初始最小系统以及基础的main函数 本次学习使用从零开始&#xff0c;不配置固件 二&#xff0c;上手软件 1.在元件…

6--SpringBootWeb案例(详解)

目录 环境搭建 部门管理 查询部门 接口文档 代码 删除部门 接口文档 代码 新增部门 接口文档 代码 已有前端&#xff0c;根据接口文档完成后端功能的开发 成品如下&#xff1a; 环境搭建 1. 准备数据库表 (dept 、 emp) -- 部门管理 create table dept( id int un…

如何有效检测住宅IP真伪?

在当今的互联网时代&#xff0c;住宅IP&#xff08;即家庭用户通过宽带服务提供商获得的IP地址&#xff09;在跨境电商、广告投放、网络安全等多个领域扮演着重要角色。然而&#xff0c;随着网络环境的复杂化和欺诈行为的增多&#xff0c;如何有效检测和辨别住宅IP的真伪成为了…

Spring:统一结果私有属性造成的前端无法访问异常报错问题

用户未填写任何评价 1.问题复现 &#xff08;1&#xff09;看一段代码 controller&#xff1a; import lombok.extern.slf4j.Slf4j; import org.ljy.testdemo.common.Result; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.w…

Centos中关闭swap分区,关闭内存交换

概述&#xff1a; Swap 分区是 Linux 系统中扩展物理内存的一种机制。Swap的主要功能是当全部的RAM被占用并需要更多内存时&#xff0c;用磁盘空间代理RAM内存。Swap对虚拟化技术资源损耗非常大&#xff0c;一般虚拟化是不允许开启交换空间的&#xff0c;如果不关闭Swap&…

【Linux课程学习】make/Makefile:Linux项目自动化构建工具

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f349;一.make/Makefile的理解&#xff1a; …

关于STM32项目面试题02:ADC与DAC篇(输入部分NTC、AV:0-5V、AI:4-20mA和DAC的两个引脚)

博客的风格是&#xff1a;答案一定不能在问题的后面&#xff0c;要自己想、自己背&#xff1b;回答都是最精简、最精简、最精简&#xff0c;可能就几个字&#xff0c;你要自己自信的展开。 面试官01&#xff1a;什么是模数转换/ADC&#xff1f;说说模数转换的流程&#xff1f; …

基于SpringBoot+Vue+MySQL的手机销售管理系统

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着智能手机的普及和市场竞争的日益激烈&#xff0c;手机销售行业面临着前所未有的挑战与机遇。传统的手工记录和简单的电子表格管理方式已难以满足现代手机销售业务的需求&#xff0c;销售数据的混乱和管理效率低…

技术成神之路:设计模式(十四)享元模式

介绍 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构性设计模式&#xff0c;旨在通过共享对象来有效地支持大量细粒度的对象。 1.定义 享元模式通过将对象状态分为内部状态&#xff08;可以共享&#xff09;和外部状态&#xff08;不可共享&#xff09;&#xf…