【数据结构Java版】Stack栈的妙用

news2024/9/30 19:30:28

目录

一、栈的概念

二、栈的使用

(1)主要方法

(2)实例演示

三、栈的模拟实现

四、栈相关练习题

(1)有效的括号

(2)栈的压入、弹出序列

(3)逆波兰表达式求值

(4)用栈实现队列


一、栈的概念

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

观察栈顶元素,而不动栈的结构:peek 

Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安
全的。


二、栈的使用

(1)主要方法

方法功能
Stack()构造一个空栈
E push(E e)将e入栈,并返回e

E pop()

将栈顶元素出栈
E peek()获取栈顶元素
int size()获取栈中有效元素
boolean empty()检测栈是否为空

(2)实例演示

import java.util.Stack;
public class Demo {
    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());
        }
    }
}

三、栈的模拟实现

// 元素类型固定为 long 类型
// 使用数组(顺序表)实现栈
// 使用尾插:压栈
// 使用尾删:弹栈
// 不考虑扩容等问题
public class Stack {
    private final long[] array = new long[100];
    private int size = 0;   // 记录为 top 也可以

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size() == 0;
    }

    public void push(long x) {
        array[size++] = x;  // 尾插
    }

    public long pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈是空的");
        }

        return array[--size];   // 尾删
    }

    public long peek() {
        if (isEmpty()) {
            throw new RuntimeException("栈是空的");
        }

        return array[size - 1];
    }

    public static void main(String[] args) {
        Stack stack = new Stack();

        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);

        System.out.println(stack.peek());   // 4
        stack.push(5);

        System.out.println(stack.peek());   // 5

        stack.push(6);

        System.out.println(stack.pop());    // 6
        System.out.println(stack.pop());    // 5
    }
}

四、栈相关练习题

(1)有效的括号

20. 有效的括号

难度简单3645

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false 
class Solution {
    public boolean isValid(String s) {
        Stack <Character> stack = new Stack<>();
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if((c=='(')||(c=='[')||(c=='{')){
                stack.push(c);
                continue;
            }else{
                if(!stack.empty()){
                    char e=stack.pop();
                    if(!isMatch(c,e)){
                        return false;
                        }
                    }else{
                        return false;
                    }
                }
            }
        if(stack.empty()){
            return true;
        }else{
            return false;
        }
    }
     public boolean isMatch(char c,char e) {
      if((e=='('&&c==')')||(e=='['&&c==']')||(e=='{'&&c=='}')){
          return true;
      }else{
          return false;
      }
    }
}

(2)栈的压入、弹出序列

【Java版oj】栈的压入、弹出序列_小熊爱吃软糖吖的博客-CSDN博客

(3)逆波兰表达式求值

【Java版oj】逆波兰表达式求值_小熊爱吃软糖吖的博客-CSDN博客

(4)用栈实现队列

232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例 1:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
class MyQueue {
    private Stack <Integer> stack1=new Stack<>();//用来放元素
    private Stack <Integer> stack2=new Stack<>();//用来出元素

    public MyQueue() {

    }
    
    public void push(int x) {
        stack1.push(x);
    }
    
    public int pop() {
        if(empty()){
            return 0;
        }
        if(stack2.empty()){
            while(!stack1.empty()){
                int elem=stack1.pop();
                stack2.push(elem);
            }
        }
        return stack2.pop();
    }
    
    public int peek() {
        if(empty()){
            return 0;
        }
        if(stack2.empty()){
            while(!stack1.empty()){
                int elem=stack1.pop();
                stack2.push(elem);
            }
        }
        return stack2.peek();
    }
    public boolean empty() {
        return stack1.empty()&&stack2.empty();
    }
}

 


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

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

相关文章

SpringBoot中mapper-locations配置多个mapper包路径

1 问题描述 大家都知道mapper-locations是配置mapper路径的&#xff0c;但是有时候mapper路径可能不止一个 比如说有两个包A和B&#xff0c;A和B里面的业务模块不同就需要写各自的mapper&#xff0c;这时候如果只配置A的mapper路径&#xff0c;那么B的mapper路径肯定扫码不到…

无法打开jupyter notebook

无法打开jupyter notebook遇到的问题问题分析tornado什么是tornado?如何更新tornado问题解决解决方法一解决方法二参考资料遇到的问题 今天打开anaconda prompt的时候想要打开jupyter notebook,但是遇到的了如下报错: Traceback (most recent call last): File “C:\ProgramD…

C++ Reference: Standard C++ Library reference: Containers: map: multimap: begin

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/multimap/begin/ 公有成员函数 <map> std::multimap::begin C98 iterator begin(); const_iterator begin() const; C11 iterator begin() noexcept; const_iterator begin() const noexcept;返回指向开…

python tkinter实现文本编辑器

题目 请设计并实现一款文本编辑器。程序允许用户打开、保存文本文件。 例如&#xff1a; 在用户打开文件时&#xff0c;会呈现打开文件对话框&#xff0c; 在用户保存文件时&#xff0c;会呈现保存为对话框 当打开文件出错时&#xff0c;程序不会崩溃&#xff0c;而是会提示…

【Python】CSV,TSV语料读取的简单操作——内建包csv的使用

背景 在做文本相关的任务时&#xff0c;难免会遇见csv&#xff0c;tsv等格式的数据&#xff0c;但有时只是读取&#xff0c;然后传入到下一个任务中而已&#xff0c;并不会做过多的操作。在这种情况下&#xff0c;可以使用pandas读取&#xff0c;但是难免有些臃肿&#xff0c;…

切记不要接受任何降薪,不要同意任何调岗,更不要害怕HR威胁背调,跟HR聊天都要录音!...

最近很多人都遭遇了裁员和降薪&#xff0c;一位网友给大家提出了几点建议&#xff1a;1.不要接受任何降薪&#xff0c;不要签字同意。如果公司敢降薪就直接去仲裁&#xff0c;但如果签字之后&#xff0c;降薪就属于你情我愿了。2.不要签字同意调岗&#xff0c;调岗会不会有薪水…

【博客559】更出色的网络监控采集方案---Telemetry(遥测技术)

网络监控方案—Telemetry(遥测技术) 1、几种不同采集方式对比&#xff1a;CLI&#xff0c;SNMP&#xff0c;SYSLOG&#xff0c;Telemetry CLI&#xff1a; 作为应用最广使用最久的网络监控技术&#xff0c;最大的问题就是兼容性&#xff0c;同类产品不同厂商之间的兼容性&…

web前端-javascript-创建Array数组和元素类型(字面量创建,构造函数创建,元素可以是任意数据类型,二维数组)

文章目录创建 Array 数组1. 普通方法2. 使用字面量来创建数组3. 使用构造函数来创建数组数组的元素类型1. 创建一个长度为 10 的数组2. 数组中的元素可以是任意的数据类型2.1. 数组中的元素也可以是对象2.2. 也可以是一个函数2.3. 数组中也可以放数组,如下这种数组我们称为二维…

早餐店+饮品+烘焙,如何做多群体早中晚生意?

早餐吃好、午餐吃饱、晚餐少吃&#xff0c;如今早餐店已经不再局限于豆浆油条、鸡蛋面包&#xff0c;同时还有饮品&#xff0c;芳芳珍早鲜奶店是一家早餐店&#xff0c;30个SKU销量很高&#xff0c;一天中有近75%的销售都集中在早餐场景。 这家早餐店是如何做的&#xff1f; 01…

【交通标志识别】BP神经网络交通标志识别(带面板)【含GUI Matlab源码 1647期】

⛄一、BP神经网络交通标志识别简介 道路交通标志用以禁止、警告、指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生.但是由于道路交通错综复杂, 且智能识别技术尚未成熟, 为了得到高效实用的道路标志识别系统, …

笔试训练(2)

// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {StringBuffer s1new StringBuffer("A");StringBuffer s2new StringBuffer("B");process(s1,s2);System.out.println(s1);System.out.pr…

推翻OpenAI结论,DeepMind重新定义预训练的参数和规模关系!

文&#xff5c;王思若前言从20年开始&#xff0c;“最大语言模型”的桂冠被各大研究机构和科技公司竞相追逐&#xff0c;堆砌参数&#xff0c;猛上算力&#xff0c;开启了“大炼丹”时代&#xff0c;模型参数量仿佛越大越好&#xff0c;甚至GPT-4模型参数量将超过100万亿的传闻…

14年本科毕业,3个月转行软件测试月薪13.5k,32的岁我终于找对了方向

​职场奋斗的过程&#xff0c;其实就是不停地做选择&#xff0c;做判断的过程。决定你发展的&#xff0c;多数取决于你的判断和眼光。你任何的投入&#xff0c;都决定了你未来的格局和结局。今天跟大家分享的我的转行故事&#xff0c;一起来看看吧。 为了新的目标和方向&#x…

PDF怎么拆分/合并? 3款 PDF 拆分和合并工具分享

以PDF格式传输文档已广泛使用很长时间&#xff0c;也是传输文档的最常见方式之一。但是&#xff0c;当涉及到从众多PDF文件中提取特定页面并将它们放在一起以制作新的PDF文档时&#xff0c;我们将需要专用软件来合并和拆分多个PDF。 现在&#xff0c;如果您想知道&#xff0c;…

叶面积指数(LAI)介绍以及遥感估算方法

前言 叶面积指数精度是正确预测产量的重要参数之一。 同时&#xff0c;还有那么多疑问&#xff0c;如何才能正确&#xff1f; 以及如何使用最有效的方法计算叶面积指数&#xff08;LAI&#xff09;&#xff1f; 什么是最佳 LAI&#xff1f; 哪些估算叶面积指数精度的方法比较好…

Matplotlib基础绘图函数示例

1. pyplot基础图表函数概述 2. pyplot饼图的绘制 3. pyplot直方图的 绘制 4. pyplot极坐标图的绘制 5. pyplot散点图的绘制 单元小结

[附源码]Python计算机毕业设计果蔬预约种植管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

内部分享讲解DevOps后,我再组织成文

DevOps 已然家喻户晓&#xff0c;如果你还没听过&#xff0c;那确实要去补补课。随着敏捷研发的普及&#xff0c;一种快速响应业务、高效运维的模式必然深得众心&#xff0c;Git 的发展近来几乎在代码管理领域一骑绝尘&#xff0c;在此基础上衍生出 GitOps 的概念&#xff0c;成…

MR案例:计算学生成绩(总分和平均分)

文章目录一、提出任务二、完成任务&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录&#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启动成绩驱动器类…

JVM本地锁(一)简单实现

JVM本地锁由ReentrantLock或synchronized实现 模拟场景 假设有个共享库存资源&#xff0c;多线程进行访问&#xff0c;每次访问库存-1. Data public class StockDemo {private Integer stock 5000; }再controller -> service 进行访问调度 Service public class StockD…