【数据结构】顺序栈

顺序栈

一、相关概念

  1. 栈和队列是操作受限的线性表,是限定性的数据结构;
  2. 栈分为顺序栈和链式栈
  3. 栈只能在一端进行操作(插入、删除)
  4. 栈是限定仅在表尾进行插入或删除操作的线性表,因此,对栈来说,表尾端具有特殊含义,称为栈顶(top),相应的,表头端称为栈底(bottom)
  5. 不含元素的空表称为空栈

二、顺序栈的结构

typedef struct Stack
{int* base; //指向动态内存int top; //栈顶指针,实际上是下标int stacksize; //栈的总大小
}Stack, *PStack;

三、顺序栈的实现

#define INIT_SIZE 10
//初始化
void InitStack(PStack ps)
{assert(ps != NULL);ps->base = (int*)malloc(INIT_SIZE * sizeof(int*));ps->top = 0;ps->stacksize = INIT_SIZE;
}
static bool IsFull(PStack ps)
{return ps->top == ps->stack;
}
static void Inc(PStack ps)
{ps->stacksize *= 2;ps->base = (int*)realloc(ps->base, ps->stacksize * sizeof(int));assert(ps->base != NULL); 
}
//入栈操作
bool Push(PStack ps, int val)
{assert(ps != NULL);if(IsFull)Inc(ps);ps->base[ps->top++] = val;return true;
}
//获取栈顶元素的值,但是不删除
//输出参数
bool GetTop(PStack ps, int *rtval)
{assert(ps != NULL);if(IsEmpty(ps))return false;*rtval = ps->base[ps->top - 1];return true;
}
//获取栈顶元素的值,但是删除
bool Pop(PStack ps, int *rtval)
{assert(ps != NULL);if(IsEmpty(ps))return false;*rtval = ps->base[--ps->top];return true;
}
//判空
bool IsEmpty(PStack ps)
{return ps->top == 0;
}
//获取栈中有效元素的个数
int GetLength(PStack ps)
{assert(ps != NULL);return ps->top;
}
//清空所有的数据
void Clear(PStack ps)
{assert(ps != NULL);ps-> top = 0;
}
//销毁
void Destroy(PStack ps)
{assert(ps != NULL);free(ps->base);ps->base = NULL;ps->top = 0;ps-> =stacksize;
}

四、顺序栈的总结

  1. 栈的特点:后进后出,后来的反而需要先服务(访问受限的线性表)
  2. 栈又分为顺序栈和链式栈
  3. 本篇顺序栈为不定长的顺序栈,能自动扩容
  4. 栈只能在一端进行插入和删除,插入和删除这一端称之为栈顶,另一端称之为栈底
  5. 顺序栈的栈顶在尾部,因为入栈和出栈的时间复杂度为O(1)

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

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

相关文章

https免费证书获取

获取免费证书的网址: Certbot 1. 进入你的linux系统,先安装snapd, yum install snapd 2. 启动snapd service snapd start 3.安装 Certbot snap install --classic certbot 注意如下出现此错误时,需要先建立snap 软连接后&am…

山东大学软件学院创新项目实训开发日志——第11周

山东大学软件学院创新项目实训开发日志——第11周 项目名称:ModuFusion Visionary:实现跨模态文本与视觉的相关推荐 -------项目目标: 本项目旨在开发一款跨模态交互式应用,用户可以上传图片或视频,并使用文本、点、…

Golang | Leetcode Golang题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; func largestRectangleArea(heights []int) int {n : len(heights)left, right : make([]int, n), make([]int, n)for i : 0; i < n; i {right[i] n}mono_stack : []int{}for i : 0; i < n; i {for len(mono_stack) > 0 &&am…

SQLite索引名称重复(index already exists)

文章目录 概述报错信息解决方案 概述 SQLite中创建单列索引的方式&#xff0c;跟MySQL类似&#xff1a; CREATE INDEX index_name ON table_name (column_name);但是也有不同的地方&#xff1a; MySQL中索引名称在表内部不重复即可。 SQLite中索引名称在整个库中必须是不重复…

整理项目中经常用到的正则

目录 1、手机号码 2、Email 邮箱 3、QQ 号码 4、非零正整数 5、URL 地址 6、身份证号 项目中难免会经常使用到表单&#xff0c;而表单项校验就需要用到正则&#xff0c; 所以整理总结一下自己项目中使用比较频繁的一些正则校验逻辑。 正则表达式 是由一些具有特殊含义的…

JavaScript之数据类型(3)——object进阶

前言&#xff1a; 利用基础知识来构建对象会发现十分复杂&#xff0c;我们可以结合其他的知识点来为我们object的构建进行优化。 <1>工厂法&#xff1a; 基本格式&#xff1a; function creatObject(属性值1,属性值2,属性值3,...,属性值n) {var 对象名 new Object();对…

在IDEA中使用 Spring Initializr 新建 spring boots 项目

【在IDEA中使用 Spring Initializr 新建 spring boots 项目 - CSDN Apphttp://t.csdnimg.cn/mVs5P Spring Initializr 创建spring boots项目 添加到pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connec…

Python | Leetcode Python题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; class Solution:def largestRectangleArea(self, heights: List[int]) -> int:n len(heights)left, right [0] * n, [n] * nmono_stack list()for i in range(n):while mono_stack and heights[mono_stack[-1]] > heights[i]:righ…

代码随想录算法训练营day21 | 513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

513.找树左下角的值 迭代法比较简单&#xff0c;层序遍历&#xff0c;找到最下面一层的第一个节点。题目已经说明节点数>1了 class Solution:def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:queue collections.deque()queue.append(root)result ro…

LeetCode题练习与总结:复原IP地址--93

一、题目描述 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&#xff0c;但是 &qu…

Rust学习笔记(中)

前言 笔记的内容主要参考与《Rust 程序设计语言》&#xff0c;一些也参考了《通过例子学 Rust》和《Rust语言圣经》。 Rust学习笔记分为上中下&#xff0c;其它两个地址在Rust学习笔记&#xff08;上&#xff09;和Rust学习笔记&#xff08;下&#xff09;。 错误处理 pani…

01、什么是ip、协议、端口号知道吗?计算机网络通信的组成是什么?

声明&#xff1a;本教程不收取任何费用&#xff0c;欢迎转载&#xff0c;尊重作者劳动成果&#xff0c;不得用于商业用途&#xff0c;侵权必究&#xff01;&#xff01;&#xff01; 目录 前言 计算机网络 网络ip地址 网络协议 网络端口号 前言 最近有个项目要用到相关文章…

Android — 使用 Runtime 获取日志并保存至 download 目录

万一哪天要用找不到 使用 Runtime 获取日志并保存至 download 目录。 try {final String path Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() File.separator;ArrayList<String> commandLine new ArrayList&l…

蓝桥杯单片机之模块代码《多样点灯方式》

过往历程 历程1&#xff1a;秒表 历程2&#xff1a;按键显示时钟 历程3&#xff1a;列矩阵按键显示时钟 历程4&#xff1a;行矩阵按键显示时钟 历程5&#xff1a;新DS1302 历程6&#xff1a;小数点精确后两位ds18b20 历程7&#xff1a;35定时器测量频率 历程8&#xff…

大数据Scala教程从入门到精通第六篇:Scala编译结果反编译分析

一&#xff1a;Scala编译结果反编译分析 问题&#xff1a;为什么Scalac之后的生成的class文件有两个&#xff0c;一个带$的&#xff0c;一个不带$的&#xff1f; 不能直接java 执行scala编译的字节码文件。 直接运行的话就会报错&#xff0c;会报一个类没有被找到。 引入类库就…

JavaScript 防抖与节流——以游戏智慧解锁实战奥秘

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f3ae; 引言❓ 什么是防抖和节流&#x1f3f9; 防抖(Debounce) - 锁定追击&#xff0c;精确无误&#x1f4cc; 基础概念&#x1f4cc; 适用场景&#x1f4cc; 实战代码&#xff1a;防抖 应用于输入框的实时搜索 &…

经济学博弈论介绍

经济学博弈论是经济学的一个重要分支&#xff0c;研究经济主体之间的策略选择和互动。博弈论的核心理论框架是“博弈”&#xff0c;即在不确定对方行为的情况下&#xff0c;个体根据自身利益和目标制定策略。 在经济学博弈论中&#xff0c;个体被称为“博弈者”&#xff0c;他…

Java基础入门day48

day48 JDBC调用关系 tomcat 简介 tomcat是Apache下的一个核心项目&#xff0c;免费开源&#xff0c;支持servlet和jsp。 tomcat技术先进&#xff0c;性能稳定&#xff0c;目前比较流行的web应用服务器 安装 官网&#xff1a; Apache Tomcat - Welcome! 下载 tomcat8.5 解压&a…

Linux入门攻坚——23、DNS和BIND基础入门1

DNS——Domain Name Service&#xff0c;协议&#xff08;C/S&#xff0c;53/udp&#xff0c;53/tcp&#xff09; BIND——Berkeley Internet Name Domain&#xff0c;ISC&#xff08;www.isc.org&#xff09; 互联网络上主机之间的通信依靠的是IP&#xff0c;而人或程序一般使…

tailwindcss大纲

布局 css说明地址aspect-ratio用于控制元素纵横比Aspect Ratio - Tailwind CSSwidth <br />max-widthcontainer&#xff1a;用于将元素的宽度固定到当前断点的组件Container - Tailwind CSScolumns用于控制元素内列数Columns - Tailwind CSSbreak-after用于控制列或页在…