算法跟练第九弹——栈与队列

ops/2025/2/13 3:30:26/

文章目录

  • part01 用栈实现队列
  • part02 用队列实现栈
  • part03 有效的括号
  • part04 删除字符串中的所有相邻重复项
  • 归纳
    • 队列

跟着代码随想录刷题的第九天。

代码随想录链接:代码随想录

part01 用栈实现队列

题目链接:232.用栈实现队列

代码:

java">class MyQueue {Stack<Integer> sIn = new Stack<>();Stack<Integer> sOut = new Stack<>();public MyQueue() {}public void push(int x) {sIn.push(x);}public int pop() {if(sOut.empty()){while(!sIn.empty()){sOut.push(sIn.pop());}}int result = sOut.pop();return result;}public int peek() {if(sOut.empty()){while(!sIn.empty()){sOut.push(sIn.pop());}}int result = sOut.peek();return result;}public boolean empty() {if(sIn.empty()&&sOut.empty())return true;return false;}
}

题解:本题的关键在于队列是先进先出,栈是先进后出,要用栈来实现队列的功能就需要用两个栈,一个正常存入数据,另一个存入第一个栈出来的数据,这样就能实现队列的功能。值得注意的是,只有当第二个数组为空时,第一个数组的数值再存入到第二个数组当中

part02 用队列实现栈

题目链接:225. 用队列实现栈

代码:

java">class MyStack {Queue<Integer> q1 = new LinkedList<>();Queue<Integer> q2 = new LinkedList<>();public MyStack() {}public void push(int x) {q2.add(x);while(!q1.isEmpty()){q2.add(q1.poll());}Queue<Integer> tmpq = q1;q1 = q2;q2 = tmpq;}public int pop() {return q1.poll();}public int top() {return q1.peek();}public boolean empty() {return q1.isEmpty();}
}

题解:队列实现栈有一个问题,在于把第一个队列的数值输出到另个队列之后,结果还是先进先出,没有任何改变。所以本题就把push进来的值放到队列2中,再把队列1中的值放到队列2中,这样就实现了后进先出

part03 有效的括号

题目链接:20. 有效的括号

代码:

java">class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for(int i = 0;i<s.length();i++){if(s.charAt(i)==')'||s.charAt(i)=='}'||s.charAt(i)==']'){   if(stack.empty())return false;if(stack.peek()==makenew(s.charAt(i))){stack.pop();continue;}return false;}stack.push(s.charAt(i));}if(stack.empty())return true;elsereturn false;}public char makenew(char a){char b= ' ';switch(a){case ')':b =  '(';break;case'}':b =  '{';break;case']':b =  '[';}return b;}}

题解:本题采用的是来实现。由于所有的括号都是一一对应的输入,所以,当遇到右括号的时候,比较栈顶元素是不是左括号,如果是的话,就弹出,否则就返回false。

part04 删除字符串中的所有相邻重复项

题目链接:1047. 删除字符串中的所有相邻重复项

代码:

java">class Solution {public String removeDuplicates(String s) {Stack<Character> stack = new Stack<>();for(int i = 0;i<s.length();i++){if(!stack.empty()&&s.charAt(i)==stack.peek()){stack.pop();continue;}stack.push(s.charAt(i));}StringBuilder a = new StringBuilder();while(!stack.empty())a.append(stack.pop());a.reverse();return new String(a);}
}

题解:本题和上题解题思路基本一致,用来求解。当遇到和当前字符相同的,就出栈,反之就进栈,继续比较。

归纳

参考来源:https://blog.csdn.net/2201_75437633/article/details/135733411

定义栈的方法

1、数组

java">public class ArrayStack {private int[] stack;private int top;public ArrayStack(int capacity) {stack = new int[capacity];top = -1;}public void push(int item) {if (top == stack.length - 1) {throw new IllegalStateException("Stack is full");}stack[++top] = item;}public int pop() {if (isEmpty()) {throw new IllegalStateException("Stack is empty");}return stack[top--];}public int peek() {if (isEmpty()) {throw new IllegalStateException("Stack is empty");}return stack[top];}public boolean isEmpty() {return top == -1;}
}

2、链表

java">public class LinkedListStack {private Node top;private class Node {int data;Node next;public Node(int data) {this.data = data;this.next = null;}}public LinkedListStack() {top = null;}public void push(int item) {Node newNode = new Node(item);if (isEmpty()) {top = newNode;} else {newNode.next = top;top = newNode;}}public int pop() {if (isEmpty()) {throw new IllegalStateException("Stack is empty");}int item = top.data;top = top.next;return item;}public int peek() {if (isEmpty()) {throw new IllegalStateException("Stack is empty");}return top.data;}public boolean isEmpty() {return top == null;}
}

3、栈,可以直接调用下面的函数

java">Stack<Object> stack = new Stack<>();

栈常用的函数:

入栈:push()
出栈:pop()//会返回栈顶元素
获取栈顶元素:peek()
判断栈是否为空:empty()
查找元素在栈中的位置,由栈底到栈顶:serch(Object o)
对当前栈进行清空:clear()

队列

参考来源:https://blog.csdn.net/2201_75437633/article/details/135823215

定义队列的三种方法

  1. LinkedList是Java中常用的双向链表实现,它同时实现了List接口和Queue接口,因此可以被用作队列来进行元素的添加和移除操作。
  • Queue queue = new LinkedList<>();
  1. ArrayDeque是一种基于数组的双端队列实现,它同样实现了Queue接口,并且在尾部添加和移除元素的操作具有较低的时间复杂度。
  • Queue queue = new ArrayDeque<>();
  1. PriorityQueue是一个基于优先级堆的无界优先级队列实现,它可以确保每次出队的元素都是队列中优先级最高的元素。
  • Queue queue = new PriorityQueue<>();

优先级队列的例子:

java">Queue<Integer> queue = new PriorityQueue<>();
queue.offer(5); // 入队
queue.offer(3);
int element = queue.poll(); // 出队
System.out.println(element); // 输出:3

队列常用的函数:

入队列:add()或者offer()
出队列:remove()或者poll()//结果返回栈顶元素
获取队列头部的元素:element()peek()
检查队列是否为空:isEmpty()
清空队列中的所有元素:clear()


http://www.ppmy.cn/ops/157947.html

相关文章

datasets: PyTorch version 2.5.1+cu124 available 这句话是什么意思

这句话的意思是&#xff1a; datasets&#xff1a;可能是 Python datasets 库的日志信息&#xff0c;说明它检测到了 PyTorch 的安装信息。PyTorch version 2.5.1cu124 available&#xff1a; PyTorch version 2.5.1&#xff1a;表示你的 PyTorch 版本是 2.5.1。cu124&#xf…

在大型语言模型(LLM)框架内Transformer架构与混合专家(MoE)策略的概念整合

文章目录 传统的神经网络框架存在的问题一. Transformer架构综述1.1 transformer的输入1.1.1 词向量1.1.2 位置编码&#xff08;Positional Encoding&#xff09;1.1.3 编码器与解码器结构1.1.4 多头自注意力机制 二.Transformer分步详解2.1 传统词向量存在的问题2.2 详解编解码…

Windows逆向工程入门之汇编环境搭建

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 Visual Studio逆向工程配置 基础环境搭建 Visual Studio 官方下载地址安装配置选项(后期可随时通过VS调整) 使用C的桌面开发 拓展可选选项 MASM汇编框架 配置MASM汇编项目 创建新项目 选择空…

【问题处理】【Mysql】mysqld进程CPU占用高排查思路

一、问题背景 Linux服务器CPU占用极高&#xff0c;经过排查&#xff0c;是mysqld占用了大部分的CPU资源。需要进一步排查是什么原因导致mysqld占用飙升。 因当前并没有大量正在执行的业务&#xff0c;所以初步排除业务量过大导致的Mysql资源飙升。 二、原因 Mysql服务端中可…

字符设备驱动开发

驱动就是获取外设、传感器数据和控制外设。数据会提交给应用程序。 Linux 驱动编译既要编写一个驱动&#xff0c;还要编写一个简单的测试应用程序。 而单片机下驱动和应用都是放在一个文件里&#xff0c;也就是杂在一块。而 Linux 则是分开了。 一、字符设备驱动开发流程 Lin…

黑马Redis详细笔记(实战篇---短信登录)

目录 一.短信登录 1.1 导入项目 1.2 Session 实现短信登录 1.3 集群的 Session 共享问题 1.4 基于 Redis 实现共享 Session 登录 一.短信登录 1.1 导入项目 数据库准备 -- 创建用户表 CREATE TABLE user (id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,phone …

DeepAR:一种用于时间序列预测的深度学习模型

介绍 DeepAR是一种基于递归神经网络&#xff08;RNN&#xff09;的时间序列预测模型&#xff0c;由亚马逊在2017年提出。它特别适用于处理多变量时间序列数据&#xff0c;并能够生成概率预测。DeepAR通过联合训练多个相关时间序列来提高预测性能&#xff0c;从而在实际应用中表…

【Pytorch实战教程】让数据飞轮转起来:PyTorch Dataset与Dataloader深度指南

文章目录 让数据飞轮转起来:PyTorch Dataset与Dataloader深度指南一、为什么需要数据管理组件?二、Dataset:数据集的编程接口2.1 自定义Dataset三要素2.2 实战案例:图像分类数据集三、Dataloader:高效数据流水线3.1 核心参数解析3.2 数据流可视化3.3 多卡训练支持四、综合…