数据结构——栈的模拟实现

大家好,今天我要介绍一下数据结构中的一个经典结构——栈。

一:栈的介绍

与顺序表和单链表不同的是:

顺序表和单链表都可以在头部和尾部插入和删除数据,但是栈的结构就锁死了(栈的底部是堵死的)栈只能从栈顶插入(数据入栈)和删除(数据出栈)数据————last in first out(后进先出)(最后入栈的数据要第一个出栈)。

如果进栈过程中不允许出栈:入栈 1 2 3 4————出栈4 3 2 1

二:栈的概念和结构

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(last in first out)的原则。

压栈:栈的插入数据操作叫做进栈或压栈或入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

来看一道经典的练习题:

这道题目看到进栈顺序是1 2 3 4,很多人会直接想到出栈顺序为 4 3 2 1.

但是答案中却没有4 3 2 1 

我们仔细读题:

题目要找不可能的出栈顺序,说明四个选项中有三个选项都是可能的出栈顺序。

在进栈过程中允许出栈的前提下,一种进栈顺序是可以对应出多种出栈顺序的。

这种题目的解法就是模拟实现上面的情境,以D选项为例:

3 4 2 1的出栈顺序

可以先入1 2 3,再出3,再入4,再出4,最后出2 1.

三:栈的模拟实现

栈的结构只能从栈顶插入和删除数据(我们在实现的过程中以数组或者链表的尾部当栈顶)。(头部当栈顶的话数组就麻烦了)。

栈的模拟实现使用数组或者单链表都是可以的,相对而言数组的结构实现更优一些。因为在数组尾部插入数据的代价比较小。

链表的话在尾部插入数据如果定义一个尾指针的话还是容易做到的,但是如果链表删除尾部数据的话还是要从头指针进行遍历的(单链表不可逆)(尾指针不容易找到其前一个结点)(使用双向链表就有点麻烦了)。(要是真的愿意使用链表的方式实现也是可以的,自己下去可以尝试)。

综上:

我们今天使用数组来实现栈这一数据结构,数组的尾部作为栈顶。

0.栈的结构的定义

这里我们还是使用动态内存栈。

1.栈的初始化

栈的模拟实现实际上跟顺序表很相似,甚至比顺序表还要简单。

这里值得说明的就是:

1.在初始化的过程中先给上数组4个存储空间,后面不够的话在添加。

2.程序的第17行top的含义是指向栈顶元素的下一个位置(初始情况下栈中没有数据top的下表就先为0).(这样的话方便后续数据入栈)。

当然这里也可以让top指向栈顶元素(初始时栈中没有元素就先指向-1,栈中插入数据之后,top就是栈顶元素的下表)

两种方式都可以,看自己平时的习惯即可(你用哪种方式实现后续操作要保持一致)。

2.插入数据(数据入栈)

插入数据首先要判断空间是否够用,不够的话扩容(二倍扩容法)。

3.删除栈顶数据(数据出栈)

删除数据之前要断言是否有数据可删(否则会有越界的风险)

未完待续……

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

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

相关文章

Ubuntu 安装 Samba Server

在 Mac 上如何能够与Ubuntu 服务器共享文件夹,需要在 Ubuntu 上安装 Samba 文件服务器。本文将介绍如何在 Ubuntu 上安装 Samba 服务器从而达到以下目的: Mac 与 Ubuntu 共享文件通过用户名密码访问 安装 Samba 服务 sudo apt install samba修改配置文…

Alan Chhabra:MongoDB AI应用程序计划(MAAP) 为客户提供价值

MongoDB全球合作伙伴执行副总裁 Alan Chhabra 每当有人向我问询MongoDB,我都会说他们很可能在不觉之间已经与MongoDB有过交集。事实上,包括70%财富百强在内的许多世界领先企业公司都在使用MongoDB。我们在MongoDB所做的一切都是为了服务客户&#xff0c…

计算机组成原理与系统结构——微程序控制

笔记内容及图片整理自XJTUSE “计算机组成原理与系统结构” 课程ppt,仅供学习交流使用,谢谢。 基本概念 微指令 将控制单元实现为基本逻辑单元之间的互连并非易事,且设计相对呆板,难以灵活地改变,因此实现微程序控制…

CUDA算子手撕与面试指南

引言 最近秋招落幕,期间一直在找高性能计算(HPC)相关岗位,整理了一些CUDA算子手撕的代码和知识点分享给大家。 项目地址:https://github.com/Tongkaio/CUDA_Kernel_Samples 如果觉得本项目对你有帮助,欢…

IIS部署程序https是访问出现403或ERR_HTTP2_PROTOCOL_ERROR

一、说明 在windows server 2016中的IIS程序池里部署一套系统,通过https访问站点,同时考虑到安全问题以及防攻击等行为,就用上了WAF云盾功能,能有效的抵挡部分攻击,加强网站的安全性和健壮性。 应用系统一直能够正常…

【EthIf-05】 Ethernet Interface main function

Ethernet Interface main function函数有以下功能和要点: 要实现支持轮询模式下帧传输确认和帧接收的以太网接口轮询机制:实现轮询功能,定期检查传入的帧。帧传输确认:包括确认帧已成功传输的机制。可配置轮询周期:允…

康耐视智能相机(Insight)通过ModbusTCP发送字符串到倍福(BECKHOFF)PLC中

文章目录 1.背景2.分析3.实现3.1.PLC的ModbusTCP_Server3.1.1.安装TF6250-Modbus-TCP3.1.2.PLC设置 3.2.智能相机的ModbusTCP_Client3.2.1.了解ModbusTCP的协议3.2.2.根据协议写代码3.2.2.1.纯函数代码3.2.2.2.脚本代码 3.2.3.非脚本处理时的代码逻辑图3.2.4.关于代码的问题及解…

ruoyi Cannot find module ‘@/views/system/user/index‘

Cannot find module /views/system/user/index 删除node_module 后打包成功

如何将你的 Ruby 应用程序从 OpenSearch 迁移到 Elasticsearch

作者:来自 Elastic Fernando Briano 将 Ruby 代码库从 OpenSearch 客户端迁移到 Elasticsearch 客户端的指南。 OpenSearch Ruby 客户端是从 7.x 版 Elasticsearch Ruby 客户端分叉而来的,因此代码库相对相似。这意味着当将 Ruby 代码库从 OpenSearch 迁…

spring cloud contract http实例

微服务很多时,服务之前相互调用,接口参数的一致性要变得很难维护。 spring cloud contract 提供了测试接口一致性的方法。 一 项目配置 plugins {id "groovy"id "org.springframework.cloud.contract" version "4.0.5"i…

帆软的无数据展示方案

文章目录 需求描述第一步、设置控件第二步、设置数据集优化改进 在日常工作中,使用到帆软报表工具,以下记录日常使用的过程, 需求描述 用帆软报表展示销量的信息,选择不同的订单状态,展示其订单数和总金额。 第一步、…

【操作系统】实验九:设备驱动程序

实验9 设备驱动程序 在钻研Linux内核的人当中,大多数人都是在写设备驱动程序。尽管由于设备的特殊性,使得每个驱动程序都不一样。但是编写设备驱动程序的许多原则和基本技巧都是一样的,甚至Windows下的设备驱动程序从原理上讲也与之相通。在…

文件上传—阿里云OSS对象存储

目录 一、OSS简介 二、OSS基本使用 1. 注册账号 2. 基本配置 (1) 开通OSS (2) 创建存储空间 (3) 修改权限 (4) 配置完成,上传一张图片,检验是否成功。 (5) 创建AccessKey 三、Java项目集成OSS 1. 导入依赖 2. Result.java代码: …

极米投影仪-看电视

文章目录 前言操作步骤1.进入GitHub下载软件2.修改后缀3.粘贴到U盘 前言 使用网络提供的电视接口免费看电视。 操作步骤 1.进入GitHub下载软件 地址:https://github.com/andandroidor/ourtv 也可以直接下载我已保存的apk,地址:https://d…

重生之我在异世界学编程之C语言:深入文件操作篇(下)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 函数递归与迭代 引言正文一、文件的基本操作&#…

Rust HTTP请求库

GITHUB 地址 LTPP-GIT 地址 接口文档 说明 http-request 是一个轻量级、高效的库,用于在 Rust 应用程序中构建、发送和处理 HTTP/HTTPS 请求。它提供了一个简单直观的 API,使开发人员可以轻松地与使用 “HTTP” 或 “HTTPS” 协议的 Web 服务进行交互…

ERC论文阅读(03)--instructERC论文阅读笔记(2024-12-14)

instructERC论文阅读笔记 2024-12-14 论文题目:InstructERC: Reforming Emotion Recognition in Conversation with Multi-task Retrieval-Augmented Large Language Models 说明:以下内容纯属本人看论文及复现代码的记录,如想了解论文细节&…

uniapp - 微信小程序

一、background-image 大图不显示的问题 解决方法: 1、使用网络地址;2、使用 base64 urlTobase64(filePath) {// #ifdef MP-WEIXINlet img ${filePath},imgBase64 wx.getFileSystemManager().readFileSync(img, "base64"),base64Url data:…

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID? 在 MongoDB …

[笔记]Qt下使用SendMessage、PostMessage和接收window消息

1.头文件和库引用 首先必须要包含windows.h这个头文件&#xff0c;如果使用一些扩展函数&#xff0c;还需要包含windowsx.h。网上说使用FindWindow要添加头文件winuser.h&#xff0c;不过应该windows.h是自动包含这个依赖的&#xff08;我没有添加&#xff09; #include <…