【算法训练-队列 一】【结构特性】用两个栈实现队列

简介: 【算法训练-队列 一】【结构特性】用两个栈实现队列

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【队列的结构特性】,使用【队列】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了LeetCode的来源),确保刷的题都是高频要面试考的题。

名曲目标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍

用两个栈实现队列【EASY】

还是一道结构特性的题,用两个栈来实现队列

题干

结合队列和栈的结构特性来解题

解题思路

元素进栈以后,只能优先弹出末尾元素,但是队列每次弹出的却是最先进去的元素,如果能够将栈中元素全部取出来,才能访问到最前面的元素,此时,可以用另一个栈来辅助取出

step 1:push操作就正常push到第一个栈栈顶。

step 2:pop操作时,如果第二个栈为空则优先将第一个栈的元素弹出,并依次进入第二个栈中,如果不为空则直接弹出第二个栈栈顶元素

第一个栈中栈底元素也就是最后进入第二个栈的栈顶元素就是队列首部元素

代码实现

给出代码实现基本档案

基本数据结构队列

辅助数据结构

算法

技巧

其中数据结构、算法和技巧分别来自:

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
  • 技巧:双指针、滑动窗口、中心扩散

当然包括但不限于以上

import java.util.*;
import java.util.Stack;
public class Solution {
    // 1 定义两个栈, 分别是队列的两头,stackPush为队列尾部,入队使用,stackPop为队列头部,出队使用
    Stack<Integer> stackPush = new Stack<Integer>();
    Stack<Integer> stackPop = new Stack<Integer>();
    public void push(int node) {
    // 2 直接入队
       stackPush.push(node);
    }
    public int pop() {
    // 3 出队前做判断,如果出队栈已经空了,则把入队栈的元素倒着压入出堆栈,如果不为空,则正常从出队栈出
       if(stackPop.isEmpty()){
         while(!stackPush.isEmpty()){
            stackPop.push(stackPush.pop());
         }
       }
       return stackPop.pop();
    }
}

复杂度分析

时间复杂度:时间复杂度是O(N),pop操作可能会触发遍历第一个栈。push操作就是O(1)

空间复杂度:空间复杂度为O(N),按题意本来提供的两个栈,并没有使用辅助数据结构,这里感觉O(1)和O(N)都可以说

拓展知识:队列的基本操作

在Java中,队列(Queue)是一种常用的数据结构,它遵循先进先出(FIFO)的原则。Java提供了多种方式来操作队列,其中最常用的是使用java.util.Queue接口,它是一个基本的队列接口,有许多不同的实现类可供选择,如LinkedListArrayDequePriorityQueue等。以下是一些常见的队列操作:

  1. 创建队列:
Queue<Type> queue = new LinkedList<>(); // 使用LinkedList实现队列
// 或
Queue<Type> queue = new ArrayDeque<>(); // 使用ArrayDeque实现队列
// 或
Queue<Type> queue = new PriorityQueue<>(); // 使用PriorityQueue实现队列
  1. 入队列(添加元素到队列尾部):
queue.add(element); // 或 queue.offer(element);
  1. 出队列(移除队列头部的元素并返回):
Type element = queue.poll(); // 如果队列为空,返回null
// 或
Type element = queue.remove(); // 如果队列为空,抛出异常
  1. 获取队列头部元素但不移除:
Type element = queue.peek(); // 如果队列为空,返回null
// 或
Type element = queue.element(); // 如果队列为空,抛出异常
  1. 检查队列是否为空:
boolean isEmpty = queue.isEmpty();
  1. 获取队列的大小:
int size = queue.size();
  1. 遍历队列:
    可以使用迭代器或增强for循环来遍历队列。
for (Type element : queue) {
    // 处理元素
}

这些是队列的基本操作。不同的队列实现可能具有不同的性能特性和用途,你可以根据你的具体需求选择合适的队列实现。请注意,在多线程环境下使用队列时,需要考虑线程安全性,可以考虑使用java.util.concurrent包中的并发队列实现,如LinkedBlockingQueueConcurrentLinkedQueue

相关文章
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
46 3
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
72 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
70 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
33 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
29天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
37 3
|
28天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
29天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
2月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
52 3
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
23 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列