栈(Stack)

8 篇文章 0 订阅
订阅专栏

目录

1.1 概念

 1.2 栈的使用

 1.3 栈的模拟实现

1.4 栈的应用场景

1. 改变元素的序列

2. 将递归转化为循环


1.1 概念

:一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO Last In First Out )的原则。
压栈:栈的插入操作叫做进栈 / 压栈 / 入栈, 入数据在栈顶
出栈:栈的删除操作叫做出栈。 出数据在栈顶

栈在现实生活中的例子:

 

 

 1.2 栈的使用

public static void main(String[] args) {
    Stack<Integer> s = new Stack();
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);
    System.out.println(s.size()); // 获取栈中有效元素个数---> 4
    System.out.println(s.peek()); // 获取栈顶元素---> 4
    s.pop(); // 4出栈,栈中剩余1 2 3,栈顶元素为3
    System.out.println(s.pop()); // 3出栈,栈中剩余1 2 栈顶元素为3
    if(s.empty()){
        System.out.println("栈空");
    }else{
        System.out.println(s.size());
    }
}

 1.3 栈的模拟实现

从上图中可以看到, Stack 继承了 Vector Vector ArrayList 类似,都是动态的顺序表,不同的是 Vector 是线程安全的。

 

public class MyStack {
    int[] array;
    int size;
    public MyStack(){
    array = new int[3];
    }
    public int push(int e){
        ensureCapacity();
        array[size++] = e;
        return e;
    }
    public int pop(){
        int e = peek();
        size--;
        return e;
    }
    public int peek(){
        if(empty()){
            throw new RuntimeException("栈为空,无法获取栈顶元素");
        }
        return array[size-1];
    }
    public int size(){
        return size;
    }
    public boolean empty(){
        return 0 == size;
    }
    private void ensureCapacity(){
        if(size == array.length){
            array = Arrays.copyOf(array, size*2);
        }
    }
}

1.4 栈的应用场景

1. 改变元素的序列

1. 若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()
A: 1,4,3,2 B: 2,3,4,1 C: 3,1,4,2 D: 3,4,2,1
2. 一个栈的初始状态为空。现将元素 1 2 3 4 5 A B C D E 依次入栈,然后再依次出栈,则元素出栈的顺序是()。
A: 12345ABCDE B: EDCBA54321 C: ABCDE12345 D: 54321EDCBA

2. 将递归转化为循环

        比如:逆序打印链表

// 递归方式
void printList(Node head){
    if(null != head){
        printList(head.next);
        System.out.print(head.val + " ");
    }
}
// 循环方式
void printList(Node head){
    if(null == head){
        return;
    }
    Stack<Node> s = new Stack<>();
    // 将链表中的结点保存在栈中
    Node cur = head;
    while(null != cur){
        s.push(cur);
        cur = cur.next;
    }
    // 将栈中的元素出栈
    while(!s.empty()){
        System.out.print(s.pop().val + " ");
    }
}

算法与竞赛(第6章) - C++与STL基础二:stack与前中后缀表达式的应用
Junds0的博客
12-07 2729
1.STL模板之stack实例:中缀表达式转前缀表达式 本关的编程任务是补全右侧代码片段main中Begin至End中间的代码,具体要求如下: 读取中缀表达式,并基于的插入、删除等基本操作实现中缀表达式转化为前缀表达式,表达式中所有的操作数为单一的数字:0~9,运算符仅包含:+ - * ( )。 // 请在这里补充代码,完成本关任务 /********* Begin *********/ char str[100]; scanf("%s", str); stack
java Stack
m0_62520968的博客
04-29 1229
JavaStack类 1.Stack类在java.util包中; 2.继承关系 Stack继承了Vector,而Vector类底层使用数组存储数据,那么Stack对象中存储的数据也是存储在数组中的。 3.构造函数 Stack只有一个无参数的构造函数。 4.常用方法介绍 (1)push(item):把数据压入 addElement()是父类Vector中的方法,会将压入的元素存放在数组末尾。 (2)peek():查看顶的数据,返回值为顶元素,底层数组中最后一个元素,但是不会删除该元
Java stack方法总结
renxingzhadan的专栏
06-30 1万+
前言 最近开始在重新刷leetcode,发现之前刷过的很多算法题现在又陆陆续续忘记了。真是应了那句话,面试造火箭,进去拧螺丝。刷了几道在贪心算法中使用stack来完成的。就重新总结下Stack的方法。 Stack和Collection的关系 Stack来自于Vector,那么显然stack的底层实现是数组。 Stack的方法 1. javaStack只有一个无参构造函数。 2. 属于stack自己的方法包括 push( num) //入 pop() //顶元素出 empty() /
java stack用法_JAVA——Stack用法详解
weixin_42638139的博客
02-13 1443
Java Stack是Vector的一个子类,它实现了一个标准的后进先出的只定义了默认构造函数,用来创建一个空除了包括由Vector定义的所有方法,也定义了自己的一些方法。创建一个空Stack()测试是否为空boolean empty()查看顶部的对象,但不从中移除它Object peek( )移除顶部的对象,并作为此函数的值返回该对象Object pop( )把项压...
STL之stack(C++)
阿怪的博客
12-09 1443
文章目录1、的定义 1、的定义 stack)是限定在表尾进行插入或删除操作的线性表。如图a,表尾称为顶,表头端称为底。修改的原则为:后进先出。
理解stack
老专家的博客
12-26 1万+
Understanding the Stack
线性表——Stack的实现 C++
净无邪博客
03-12 1865
和队列是应用最多的数据结构之二,有数组实现和链表实现两种方式。当需要对容器做出限制,只允许一边插入和取出数据时,则需要用到。下面将总结数组实现的和阐述其原理。 一、线性表——Stack 1.1Stack定义 是一种特殊的线性表,其插入(也称为入或压)和删除(也称为弹出或出)操作都在表的同一端进行;该插入和删除的端口称为顶(top),另一端称为底(bottom)。 1.2的基本运算 1.2.1基本运算 (1) 初始化(构造一个空的) (2) 计算长度(中节点个数) (3) 插入节
Java中的Stack、Deque、ArrayDeque、LinkedList的区别
热门推荐
qq_37509948的博客
02-19 2万+
Java中的Stack、Deque、ArrayDeque、LinkedList的区别Stack类那么为什么我们不选择Stack呐?(两个主要原因)那么我们应该使用ArrayDeque还是LinkedList呐?总结 StackJavaStack类底层是数组实现的线程安全的。先进后出,常用操作是push/pop/peek 而Deque是更加适用的双端队列接口,其通过ArrayDeque/LinkedList初始化实现 Deque<Integer> stack = new ArrayDeq
【详解Stack与队列Queue】
TheMyth142857的博客
05-24 2192
本章主要介绍了和队列这两种数据结构,它们属于特殊线性表,通常在学习的时候对比学习队列。本文如有不足之处,请广大读者提出宝贵意见!!!谢谢!!!
进制转换专题——C++STLstack
人生处处是围城,一切都是最好的安排!
12-05 1532
详解二进制、八进制、十进制、十六进制数间的互相转换与C++STL库函数中stack的应用。
C++stack算法 最全面
07-23
stack算法:算法训练营 P68~74 题目类型 :stack问题 P69~74 原题解析 :见算法训练营 P74~74 */ #include using namespace std; int main() { cout算法"; cout初始值为 http://www.acm.org"<<'\n'; cout...
JS的函数调用stack size的计算方法
12-11
如果你写了一个一直调用自身的死循环,那么恭喜你,很快就可以看到报错:Uncaught RangeError: Maximum call stack size exceeded。那么这个call stack size有多少呢? 1. 计算方法 如下的方法可以为你计算出你使用...
基于C语言数据结构-stack
06-25
在这个主题中,我们专注于Stack)这一重要的数据结构,它是基于C语言实现的。是一种线性数据结构,遵循“后进先出”(LIFO,Last In First Out)原则,它的操作类似于日常生活中的堆叠物品,最新的添加的物品...
JSstack类的实现与使用方法示例
10-17
在JS中实现Stack数据结构及使用方法是JavaScript数据结构与算法知识的一部分,它涉及对这种数据结构特性的理解和实现。是一种特殊的列表,其插入和删除操作仅限在一端进行,使得这一端被称为顶,而另...
20240818 字节跳动 笔试
最新发布
lc_guo的博客
10-22 586
BSP驱动开发工程师-OS、4 道编程题
数据结构)单链表——C语言
2401_83456040的博客
10-19 1032
尾插即从链表尾部插入,注意这里传参需要传二级指针,因为这里可能会引起头结点的改变,要使实参的改变,就要传它的指针,本身它就是一级指针,所以这里传二级,首先断言pphead不能指为空,申请一个结点,如果链表为空,则直接将申请的结点直接赋给头结点,如果链表不为空,因为链表只能从上一个结点找到下一个,所以尾插之前,就要找到尾结点,就需要遍历整个链表,再将尾结点的下一个结点,指向newnode,即可。从头部删除,先定义头结点的next结点,free掉头结点,再将next结点赋给next,成为新的头结点。
#数据结构(一)--线性表
2302_79847831的博客
10-17 485
单链表是一种链式的存储结构,逻辑上相邻的元素的存储位置是通过指针连接的,因而每个节点的存储位置可以任意安排不需要相邻,所以插入删除操作只需要修改相关节点的指针域即可,在双链表中,由于每个节点既包括指向后继节点的指针,又包含一个指向前驱节点的指针,所以当访问过一个节点后既可以以此向后访问每一个节点也可以依次向前访问每一个节点。在声明线性表的顺序存储结构,定义一个数组来存储顺序表的所有元素,还定义一个整形变量size来存储顺序表的实际长度。头插法的核心点是一直在头节点的后面添加元素,导致单链表是倒置的。
Python数据分析NumPy和pandas(九、pandas数据结构之Series)
FreedomLeo1的博客
10-17 888
pandas 吸取了 NumPy 的基于数组的计算风格的重要部分,尤其是基于数组的函数的计算和丢弃 for 循环的数据处理。Series 是一个类似于一维数组的对象,包含相同类型的值序列(类型类似于 NumPy 类型)和一个关联的数据标签数组(即索引)。原字典的键成了Series数组的索引,原值成了现在Series数组的值。在Series对象上使用numpy的函数或者类似于numpy的操作,比如布尔数组的筛选、乘法运算等,得到的结果会。从结果可以看出,没有相同索引标签的结果为NaN。
数据结构--和队列
Lotus_zyz的博客
10-19 426
是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为顶,另一端称为底。中的数据元素遵守后进先出的原则队列也是一种特殊的线性表,不同于,队列只允许在一端进行插入数据操作,在另一端进行删除数据操作。进行插入操作的一端称为队尾,进行删除操作的一端称为队头。队列中的数据元素遵守先进先出的原则。
写文章

热门文章

  • MySQL的安装及环境变量配置(超详细) 6339
  • 网络原理之传输层与网络层重点协议 3268
  • C语言倒计时器 2849
  • 网络编程套接字 2751
  • 初始网络原理 2417

分类专栏

  • JavaEE进阶 5篇
  • JavaEE 17篇
  • C语言 16篇
  • 算法 1篇
  • MySQL 6篇
  • javaSE 10篇
  • 数据结构 8篇
  • 力扣 8篇

最新评论

  • MySQL的安装及环境变量配置(超详细)

    Ll_96: 谢谢大佬 终于解决了

  • 使用git提交代码到Gitee没有小绿点

    Jeff不能吃饭: 优质好文,希望博主持续输出,多多分享

  • Spring 创建和使用

    AQin1012: 文章思路清晰,图文并茂,详略得当,三连支持,期待博主持续输出好文

  • Bean的作用域

    风起、风落: 这么好的文章不多见了表情包

  • Bean 的生命周期

    逆风飞翔的小叔: java优质好文,文章细节到位,干货很多,实用性很好读完很有收获,感谢大佬的优质好文,期待持续更新,期待大佬的指点哦

最新文章

  • IT论坛测试
  • Bean 的生命周期
  • Bean的作用域
2023年57篇
2022年11篇

目录

目录

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mᴇᴇᴛ ꦿ᭄.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家景观玻璃钢雕塑施工方案洛阳玻璃钢人物园林雕塑厂家商场角落 美陈天水人物玻璃钢雕塑设计玻璃钢大卫雕塑洛阳校园玻璃钢人物雕塑报价四川大型主题商场美陈制作玻璃钢西瓜雕塑定做大连玻璃钢雕塑制作批发山东景观玻璃钢雕塑定做价格福建商业商场美陈费用九台玻璃钢园门头雕塑厂北京中庭商场美陈费用衢州玻璃钢人物雕塑厂家供应百货商场美陈费用镇江设计玻璃钢雕塑厂家山东中庭商场美陈批发价玻璃钢雕塑建模新郑大型不锈钢玻璃钢仿铜雕塑商场创意商业美陈吉林玻璃钢卡通雕塑厂家批发购买玻璃钢花盆河北景观玻璃钢雕塑多少钱银川玻璃钢植物雕塑价格南京广场玻璃钢花盆马鞍山创意玻璃钢雕塑定做价格濮阳大型玻璃钢景观雕塑南通玻璃钢仿铜雕塑定做商场美陈气球布置教程衢州户内玻璃钢雕塑定做价格香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化