栈的基础知识

一、栈的定义与特点

   栈:只能在表的一端(栈顶)进行插入和删除运算的线性表

  逻辑结构           与线性表相同,仍为一对一关系
  存储结构           用顺序栈和链栈存储均可,但顺序栈更常见
  访问结点时依照后进先出(LIFO)先进后出(FILO)的原则

   进栈------压入-----push()                        出栈-----弹出-----pop()

栈与线性表-仅在于运算规则不同

   线性表:
          逻辑结构:一对一
          存储结构:顺序表、链表
          运算规则:
                     顺序表——随机存取
                     链表——顺序存取

  栈
          逻辑结构:一对一
          存储结构:顺序栈、链栈
          运算规则:后进先出,先进后出

栈顶:线性表允许进行插入删除的那一端。

栈底:固定的,不允许进行插入和删除的另一端。

空栈:不含任何元素的空表。

栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为1/(n+1)C ~2n~ *n

栈的抽象数据类型:
    ADT Stack {
             数据对象:D={ai| ai∈ElemSet, i=1,2,...,n, n≥0 }
             数据关系:R1={ <ai-1,ai>| ,ai-1,ai∈D, i=2,...,n } 约定an端为栈顶,a1端为栈底。
             基本操作:
                InitStack(&S) 操作结果:构造一个空栈 S。
                DestroyStack(&S) 初始条件:栈 S 已存在。 操作结果:栈 S 被销毁。
                ClearStack(&S) 初始条件:栈 S 已存在。 操作结果:将 S 清为空栈。
                StackEmpty(S) 初始条件:栈 S 已存在。 操作结果:若栈 S 为空栈,则返回TRUE,否则返回FALSE。
                StackLength(S) 初始条件:栈 S 已存在。 操作结果:返回栈 S 中元素个数,即栈的长度。
                GetTop(S, &e) 初始条件:栈 S 已存在且非空。 操作结果:用 e 返回S的栈顶元素。
                Push(&S, e) 初始条件:栈 S 已存在。 操作结果:插入元素 e 为新的栈顶元素。
                Pop(&S, &e) 初始条件:栈 S 已存在且非空。 操作结果:删除 S 的栈顶元素,并用 e 返
回其值。
} ADT Stack 

二、栈的顺序存储结构

顺序栈的存储方式
     同一般线性表的顺序存储结构完全相同,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。栈底一般在低地址端。
    附设top指针,指示栈顶元素在顺序栈中的位置。
    另设base指针,指示栈底元素在顺序栈中的位置。
为了方便操作,通常top指示真正的栈顶元素之上的下标地址
另外,用stacksize表示栈可使用的最大容量。

顺序栈的表示

#define MAXSIZE 100
       typedef struct{
          SElemType *base;
          SElemType *top;
          int stacksize;
        }SqStack;

顺序栈初始化(构造一个空栈)
(1)分配空间并检查空间是否分配失败,若失败则返回错误
(2)设置栈底和栈顶指针S.top = S.base;
(3)设置栈大小

Status InitStack( SqStack &S ){
             S.base =new SElemType[MAXSIZE];
             if( !S.base ) return OVERFLOW;
             S.top = S.base;
             S.stacksize = MAXSIZE;
              return OK;
 }

判断顺序栈是否为空
   bool StackEmpty( SqStack S ){
            if(S.top == S.base) return true;
            else return false;
  }

求顺序栈的长度
 int StackLength( SqStack S ){
           return S.top – S.base;
 }

清空顺序栈
Status ClearStack( SqStack S ){
             if( S.base )
             S.top = S.base;
             return OK;
}

销毁顺序栈
Status DestroyStack( SqStack &S ){
        if( S.base ){
            delete S.base ;
            S.stacksize = 0;
            S.base = S.top = NULL;
        }
        return OK;
}

 顺序栈进栈
       (1)判断是否栈满,若满则出错
       (2)元素e压入栈顶
       (3)栈顶指针加1
Status Push( SqStack &S, SElemType e){
            if( S.top - S.base== S.stacksize ) // 栈满
            return ERROR;
            *S.top++=e;
            return OK;
}

顺序栈出栈
        (1)判断是否栈空,若空则出错
        (2)栈顶指针减1
        (3)获取栈顶元素e
Status Pop( SqStack &S, SElemType &e){
          if( S.top == S.base ) // 栈空
          return ERROR;
          e= *--S.top;
          return OK;
}

取顺序栈栈顶元素
判断是否空栈,若空则返回错误
否则通过栈顶指针获取栈顶元素

Status GetTop( SqStack S, SElemType &e){
             if( S.top == S.base ) return ERROR; // 栈空
             e = *( S.top – 1 );
             return OK;
}

三、共享栈

     将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈
顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长。

 栈空:top[i] == bot[i] i表示栈的编号
 栈满:top[0]+1==top[1] 或top[1]-1==top[0]

共享栈定义
     #define Maxsize 100
     typedef struct{
           int top[2], bot[2];                            //栈顶和栈底指针
           SElemType data[Maxsize];           //栈数组
     }DblStack;

四、链栈


  采用链式结构存储的栈称为链栈,是运算受限的单链表,只能在链表头部进行操作,故没有必要附加头结点。栈顶指针就是链表的头指针。

  typedef struct StackNode {
           SElemType data;
           struct StackNode *next;
} StackNode, *LinkStack;

链栈初始化
void InitStack(LinkStack &S ){
     //构造一个空栈,栈顶指针置为空
     S=NULL;
}

链栈判空
Status StackEmpty(LinkStack S){
              if (S==NULL) return TRUE;
              else return FALSE;
}

链栈进栈
Status Push(LinkStack &S , SElemType e){
             p=new StackNode; //生成新结点p
             if (!p) exit(OVERFLOW);
             p->data=e;
             p->next=S; //??为什么这里不是S->next呢?
             S=p;
             return OK;
}

链栈出栈
Status Pop (LinkStack &S,SElemType &e){
            if (S==NULL) return ERROR;
            e = S-> data;
            p = S;
            S = S-> next;
            delete p;
            return OK;
}

取栈顶元素
SElemType GetTop(LinkStack S){
          if (S==NULL) exit(1);
          else
          return S–>data;
}

链栈的特点:

(1)不存在栈满(上溢)的情况。

(2)栈顶指针就是链表头指针。
(3)头插法建立单链表相当于进栈。
(4)单链表的删除相当于出栈。
 

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

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

相关文章

漏洞复现-万户OA text2Html 任意文件读取(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

vue父子组件传值问题

在Vue中&#xff0c;父子组件之间的数据传递可以通过props和事件来实现。 使用props传递数据&#xff1a;父组件可以通过props将数据传递给子组件&#xff0c;子组件可以在模板中直接使用这些数据。父组件可以通过v-bind指令将数据绑定到子组件的props上。例如&#xff1a; v…

初识Cargo-Rust的包管理器

Cargo 是Rust的 包管理器。Cargo 会下载您Rust 的包依赖项&#xff0c;编译包&#xff0c;生成可分发的包&#xff0c;并将它们上传到crates.io - Rust 社区的包注册表。 安装的方法 安装 Rust 和 Cargo 获得 Cargo 的最简单方法是使用rustup脚本&#xff0c;获取当前稳定版本…

Cesium介绍及3DTiles数据加载时添加光照效果对比

一、Cesium简介 Cesium原意是化学元素铯&#xff0c;铯是制造原子钟的关键元素&#xff0c;通过命名强调了Cesium产品专注于基于时空数据的实时可视化应用。熟悉GIS开发领域的读者都知道&#xff0c;Cesium是一个用于创建3D地理空间应用程序的开源JavaScript库&#xff0c;它允…

《SPSS统计学基础与实证研究应用精解》视频讲解:数据缺失值处理

《SPSS统计学基础与实证研究应用精解》4.12 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解4.12节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。本书旨在手把手教会…

GraphicsMagick 的 OpenCL 开发记录(二十五)

文章目录 如何修复R6025 pure virtual function call问题 <2022-04-19 周二> 如何修复R6025 pure virtual function call问题 运气好&#xff0c;修复了这个问题。即&#xff0c;在ExitInstance()函数中调用一下MagickLib::DestroyMagick();即可。 过程中也经历了尝试…

用友U8接口-部署和简要说明(1)

概括 本专栏文章目的说明对目前用友U8ERP接口介绍对底层接口二次封装的介绍 说明 过去发布过介绍U8接口文章简介&#xff0c;参考以下链接。 U8接口开发方式 本专栏文章与下面的HTTP接口相辅相成&#xff0c;主要是写给正在使用&#xff0c;或未来使用本套接口的开发人员&am…

JDK8新特性(二)

接着上一章&#xff0c;我们继续学习jdk8新特性 目录 一、Optional 1.使用 1.1创建对象 1.2安全消费值 1.3获取值 1.4安全获取值 1.5过滤 1.6判断 1.7数据转换 二、函数式接口 1.常见函数式接口 2.常用的默认方法 三、方法引用 1. 推荐用法 2.基本格式 3.语法详解…

动态规划和字符串结合leetcode题集(java实现版)

目录 leetcode5.最长回文子串 leetcode718.最长重复子数组 leetcode300.最长递归子序列 leetcode72.编辑距离 leetcode10.正则表达式匹配 leetcode122.买卖股票的最佳时机II leetcode714.买卖股票的最佳时机含手续费 leetcode121.买卖股票的最佳时机 leetcode123.买卖…

ESP32 操作AT24C32或AT24C64

AT24C32或AT24C64两款芯片容量不一样&#xff0c;其他都一样。程序无法动态识别容量AT24C32容量32K&#xff0c;地址范围0x~0x7FFF.AT24C64容量64K,地址范围0x~0xFFFF 电气参数 电压2.7V-5.5V IIC通信 有引脚控制数据保护 有引脚可以配置IIC的地址。 每个page 32字节 1百…

二叉树计算 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 给出一个二叉树如下图所示&#xff1a; 6 / \ 7 9 \ / -2 6 请由该二叉树生成一个新的二叉树&#xff0c;它满足其树中的每个节点将包含原始树中的左子树和右子树…

构建全面有效的监控运维考核评分标准体系

在现代企业的IT运维管理中&#xff0c;监控运维考核评分标准体系不仅是衡量运维团队工作效果的重要工具&#xff0c;更是推动企业IT服务持续改进和优化的关键所在。一个完善、合理的考核评分标准体系能够客观地反映运维团队的实际工作表现&#xff0c;为管理层提供决策支持&…

30岁以就业为目标学前端,快歇着吧;反之50岁都不晚。

Hi&#xff0c;我是贝格前端工场&#xff0c;首先声明声明我们不搞前端培训&#xff0c;有很多老铁在留言中问我关于前端学习的问题&#xff0c;最普遍的一个问题就是30岁以后学前端晚了吗&#xff1f;今天借着此篇文章回答一下。 一、30岁学前端的三种人 首先抛开年龄不说&am…

macbook air(M1 2020)安装graphviz和python pip或conda 安装pygraphviz

第一步,先用Homebrew转graphviz包 brew install graphviz 能够在以下路径中找到graphviz文件:(/opt/homebrew/Cellar/graphviz) 第二步. 安装pygraphviz时提供搜索路径 pip3 install --global-optionbuild_ext --global-option"-I$(brew --prefix graphviz)/include"…

【EI会议征稿通知】第三届能源、电力与电气国际学术会议(ICEPET 2024)

第三届能源、电力与电气国际学术会议&#xff08;ICEPET 2024&#xff09; 2024 3rd International Conference on Energy, Power and Electrical Technology 第三届能源、电力与电气国际学术会议&#xff08;ICEPET 2024&#xff09;由西华大学主办&#xff0c;西华大学能源…

C语言系列-浮点数在内存中的存储

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 目录 浮点数在内存中的存储 浮点数的存储 浮点数存的过程 浮点数取的过程 题目解析 浮点数在内存中的存储 常见的浮点数&#xff1a;3.14159.1E10等&#xff0c;浮点数家族包括&…

【HDFS】一天一个RPC系列--updateBlockForPipeline

本文目标是: 弄清updateBlockForPipeline这个RPC的作用。弄清updateBlockForPipeline RPC的使用场景,代码里的调用点。一、updateBlockForPipeline的作用 其定义在ClientProtocol接口里,是Client与NameNode之间的接口。 看其代码注释描述: 为一个under construction状态下…

前端JavaScript篇之什么是 JavaScript 包装类型?将包装类型转换为基本类型的方法

目录 什么是 JavaScript 包装类型&#xff1f;将包装类型转换为基本类型的方法什么是 JavaScript 包装类型&#xff1f;包装类型的作用字符串包装类型数字包装类型布尔包装类型总结 将包装类型转换为基本类型的方法总结 什么是 JavaScript 包装类型&#xff1f;将包装类型转换为…

Java中的四种线程池详解及使用场景

前言 在Java并发编程中&#xff0c;JDK提供了一套强大的线程池工具类java.util.concurrent.ThreadPoolExecutor以及它的四个便捷工厂方法&#xff0c;这四种线程池分别对应不同的使用场景和特性。下面将详细介绍每种线程池的创建方式、工作原理以及适用场景。 1. CachedThrea…

Linux文本三剑客---grep

grep&#xff08;从文本或字符串种过滤特定内容。&#xff09; 格式&#xff1a;Usage: grep [OPTION]... PATTERNS [FILE]... 常用选项&#xff1a; -E 等价于 egrep 扩展正则 -i 忽略大小写 -w 匹配单词 -o 仅显示匹配内容 -r 递归匹配 -c 统计匹配的行数 -v 取反 -n 行号 -A…