Leetcode栈&队列

232.用栈实现队列


题干:


思路:

  • 栈是FILO,队列是FIFO,所以如果要用栈实现队列,目的就是要栈实现一个FIFO的特性。
  • 具体实现方法可以理解为,准备两个栈,一个栈用作输入栈,入数据就存数据,一个栈用作输出栈,出数据就入数据再弹数据。

代码:

class MyQueue {
/**
* 先声明变量,留在MyQueue方法中进行Init
*/
Stack<Integer> stackIn;
Stack<Integer> stackOut; public MyQueue() {
stackIn=new Stack<Integer>();
stackOut=new Stack<Integer>();
} public void push(int x) {
stackIn.push(x);
} public int pop() {
dumpStackIn();
return stackOut.pop();
} public int peek() {
dumpStackIn();
return stackOut.peek();
} public boolean empty() {
//不难得出,当输入输出栈均为空时,队列就是空的
return stackOut.isEmpty()&&stackIn.isEmpty();
} private void dumpStackIn(){
if(!stackOut.isEmpty()){
return;
}
while (!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}

20.有效的括号


题干:

思路:

  • 这种匹配类的题目都可以用栈来解决。当某组括号的左括号被扫描到时,我们就将与它配对的括号入栈(它本身也可以,但是存入配对的括号在后续步骤中可以通过判断是否相同来加快速度),之后遇到相同的括号就将其出栈。
  • 第一种情况:扫描完毕,栈同时也是空的。对应着有效的字符串
  • 第二种情况:扫描未完毕,栈已经空了。对应着左括号数量少于右括号,不符合要求
  • 第三种情况:扫描完毕,栈未空,说明左括号数量大于右括号,不符合要求
  • 第四种情况:扫描未完毕,发现栈顶元素与当前括号类型不匹配,不符合要求

代码:

class Solution {
public boolean isValid(String s) {
//这里使用双向链表deque来模拟栈
Deque<Character> deque = new LinkedList<>();
char ch;
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i);
if (ch == '(') {
deque.push(')');
}else if (ch == '{') {
deque.push('}');
}else if (ch == '[') {
deque.push(']');
} else if (deque.isEmpty() || deque.peek() != ch) {
return false;
}else {
deque.pop();
}
}
return deque.isEmpty();
}
}

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


题干:

思路:

  • 有效的括号有着异曲同工之妙,我们依次扫描传入的字符串,并判断栈顶元素是否与当前扫描到的字符相同,如果相同,则出栈此元素,扫描完毕后,将栈中元素弹出逆序即可。
  • 在这题中,我们将频繁使用到删除这个操作,根据数据结构的知识,这种情况下采用Array结构将比LinkedList结构快一些

代码:

class Solution {
public String removeDuplicates(String s) {
Deque<Character> deque=new LinkedList<>();
char letter;
for(int i=0;i<s.length();i++){
letter=s.charAt(i);
if(deque.isEmpty()||deque.peek()!=letter){
deque.push(letter);
}else{
deque.pop();
}
}
String ans="";
while (!deque.isEmpty()){
//每次将上一次的ans放到末尾,就可以起到reverse的作用了
ans=deque.pop()+ans;
}
return ans;
}
}

Tips:

  • 写的时候将deque.pop()写成了deque.add(),查询代码以后发现了两者的区别
  • 首先是返回值不同,push的返回值为void,add的返回值为Boolean;其次是位置不同,push插入头,add插入尾

150.逆波兰表达式求值


题干:

Tips:

  • 表达式有前缀、中缀、后缀,其中前缀表达式称为波兰表达式,这也就是为什么后缀表达式叫逆波兰表达式,中缀表达式就是人们日常运算时所书写的形式,例如1+1+1+1=4这种。分类标准就是依据将运算符号放置在运算数前、中还是后。

思路:

  • 读《算法》第四版的时候,书中的经典例题,没遇到运算符之前就入栈,遇到运算符就将运算符出栈,并同时出栈两个数字,进行与对应的出栈的运算符的运算操作,并最后将运算结果压入栈中。
  • 需要注意的是,在进行减法与除法这类需要考虑顺序的运算时,不要直接就大意的认为将出栈的两个数字相减或是相除就行了。

代码:

class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack=new LinkedList<Integer>();
for(int i=0;i<tokens.length;i++){
if("+".equals(tokens[i])){
stack.push(stack.pop()+stack.pop());
}else if("-".equals(tokens[i])){
stack.push(-stack.pop()+stack.pop());
}else if("*".equals(tokens[i])){
stack.push(stack.pop()*stack.pop());
}else if("/".equals(tokens[i])){
int temp1=stack.pop();
int temp2=stack.pop();
stack.push(temp2/temp1);
}else{
stack.push(Integer.valueOf(tokens[i]));
}
}
return stack.pop();
}
}

347.前K个高频元素


题干:

思路:

  • 第一个想法是利用哈希表存入数字与其出现的次数,排序之后取最前的K个value对应的key就可以了。

代码:

class Solution {
public int[] topKFrequent(int[] nums, int k) {
int[] ans=new int[k];
Map<Integer,Integer> map=new HashMap();
for(int i:nums){
if(map.containsKey(i)){
map.put(i,map.get(i)+1);
}else {
map.put(i,1);
}
}
int max=0;
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if(entry.getValue()>max){
max=entry.getValue();
}
} while (k>0){
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if(entry.getValue()==max){
ans[k-1]=entry.getKey();
k--;
}
}
max--;
}
return ans;
}
}

Tips:

  • 在Hashmap中,每一个Key-Value被看作是一个set集合。

  • 为了更便捷的获取Key-Value,使用Entry来进行编写,for-each循环中用entrySet把每一个键值对取出进行遍历。

Leetcode栈&队列的更多相关文章

  1. 栈&队列&并查集&哈希表(julyedu网课整理)

    date: 2018-11-25 08:31:30 updated: 2018-11-25 08:31:30 栈&队列&并查集&哈希表(julyedu网课整理) 栈和队列 1. ...

  2. java 集合 Connection 栈 队列 及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

  3. Java 容器之 Connection栈队列及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

  4. java面向对象的栈 队列 优先级队列的比较

    栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一 ...

  5. C++实现一个简单的双栈队列

    双栈队列的原理是用两个栈结构模拟一个队列, 一个栈A模拟队尾, 入队的元素全部压入此栈, 另一个栈B模拟队首, 出队时将栈A的元素弹入栈B, 将栈B的栈顶元素弹出 此结构类似汉诺塔, 非常经典, 这里 ...

  6. leetcode 栈和队列类型题

    1,Valid Parentheses bool isVaild1(string& s) { // 直接列举,不易扩展 stack<char> stk; ; i < s.le ...

  7. leetcode 栈 括号匹配

    https://oj.leetcode.com/problems/valid-parentheses/ 遇到左括号入栈,遇到右括号出栈找匹配,为空或不匹配为空, public class Soluti ...

  8. 【图解数据结构】 栈&队列

    [TOC] 勤于总结,持续输出! 1.栈 1.1栈的定义 栈(stack)是限定在表尾进行插入和删除的操作的线性表. 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不包 ...

  9. 数据结构 栈&队列

    2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针: 增加,移动尾指针: 删除a,b ,队头c 2-3 在一个链队列中,fron ...

随机推荐

  1. 基于Docker-compose搭建Redis高可用集群-哨兵模式(Redis-Sentinel)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_110 我们知道,Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3) ...

  2. 使用Python3.7+Tornado5.1配合七牛云存储api来异步切分上传文件

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_123 之前写了几篇关于FastDfs分布式存储的文章:python3.7.3操作FastDfs来进行文件操作,其实市面上关于云存储 ...

  3. 什么是 DevOps?看这一篇就够了!

    本文作者:Daniel Hu 个人主页:https://www.danielhu.cn/ 目录 一.前因 二.记忆 三.他们说-- 3.1.Atlassian 回答"什么是 DevOps?& ...

  4. meterpreter后期攻击使用方法

    Meterpreter是Metasploit框架中的一个扩展模块,作为溢出成功以后的攻击载荷使用,攻击载荷在溢出攻击成功以后给我们返回一个控制通道.使用它作为攻击载荷能够获得目标系统的一个Meterp ...

  5. Web 布局设计(一):固定侧边栏

    前言 闲着无事,做一些实战练习,今天实现一个如标题所示的布局设计.通过此次布局设计,我希望掌握position属性值 fixed.absolute.relative.width和height属性值 i ...

  6. PerfView专题 (第七篇):如何洞察触发 GC 的 C# 代码?

    一:背景 上一篇我们聊到了如何用 PerfView 洞察 GC 的变化,但总感觉还缺了点什么? 对,就是要跟踪到底是什么代码触发了 GC,这对我们分析由于 GC 导致的 CPU 爆高有非常大的参考价值 ...

  7. 操作系统学习笔记5 | 用户级线程 && 内核级线程

    在上一部分中,我们了解到操作系统实现多进程图像需要组织.切换.考虑进程之间的影响,组织就是用PCB的队列实现,用到了一些简单的数据结构知识.而本部分重点就是进程之间的切换. 参考资料: 课程:哈工大操 ...

  8. 【Java】学习路径63-反射、类的加载-附思维导图(完结)

    这一章的知识在实际开发也没有那么重要,主要是了解即可,另外掌握如何使用反射机制. 类的使用: 在虚拟机中: 类的加载->类的连接->类的初始化 类的加载   只会加载需要用到的类,加载到内 ...

  9. 【java】学习路径40-Buffer缓冲区输入流

    @Testpublic void testBufferInputStream(){ BufferedInputStream bfis = null; try { bfis = new Buffered ...

  10. String与StringBuilder相互转换以及获取字符串中第一个中文汉字

    String与StringBuilder相互转换 1. StringBuilder转为String StringBuilder sb = new StringBuilder(); sb.append( ...