首页 > 其他分享 >04-栈和队列

04-栈和队列

时间:2023-11-09 09:15:11浏览次数:45  
标签:04 val 队列 pop int push public empty

4. 栈和队列

栈:push,pop,peek(返回当前值),empty

队列:add,remove,peek(返回当前值),isEmpty

4.1 双向链表实现栈和队列

4.2 数组实现栈和队列

加一个指针指向某个位置。

队列:环形数组

4.3 最小栈

1. 题目

https://leetcode.cn/problems/min-stack/

设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

示例 1:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

2. 思路

两个栈,A栈放值,B栈放当前A的最小值(新加入的时候,如果比最小值大就接着放之前的最小值,如果比最小值小,就放新的最小值)

3. 代码

class MinStack {
    Deque<Integer> val;
    Deque<Integer> min;
    public MinStack() {
        val = new LinkedList<Integer>();
        min = new LinkedList<Integer>();
    }
    
    public void push(int val) {
        this.val.push(val);
        if(this.min.isEmpty()){
            this.min.push(val);
        }else{
            int cur = this.min.peek();
            if(cur > val){
                this.min.push(val);
            }else{
                this.min.push(cur);
            }
        }
    }
    
    public void pop() {
        if(!val.isEmpty()){
            val.pop();
            min.pop();
        }
    }
    
    public int top() {
        return val.peek();
    }
    
    public int getMin() {
        return min.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

4.4 用栈实现队列

1. 题目

https://leetcode.cn/problems/implement-queue-using-stacks/

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

实现 MyQueue 类:

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

输入:
["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

2. 思路

两个栈,一个in,一个out,

进入:加入到in栈。

弹出:如果out为空,就把in倒入,否则弹出out。

3. 代码

class MyQueue {
    Stack<Integer> in;
    Stack<Integer> out;
    public MyQueue() {
        in = new Stack<Integer>();
        out = new Stack<Integer>();
    }
    public void inToOut(){
        while(!in.empty()){
            out.push(in.pop());
        }
    }
    public void push(int x) {
        in.push(x);
    }
    
    public int pop() {
        if(out.empty()){
            // 清空in到out中
            inToOut();
        }
        return out.pop();
    }
    
    public int peek() {
        if(out.empty()){
            // 清空in到out中
            inToOut();
        }
        return out.peek();
    }
    
    public boolean empty() {
        if(out.empty() && in.empty()){
            return true;
        }
        return false;
    }
}

4.4 用队列实现栈

1. 题目

https://leetcode.cn/problems/implement-stack-using-queues/

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]
解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

2. 思路

两个队列,A,B,不断转换状态。

弹出:A中只留一个剩下加入B,B转为活跃,A的弹出。而后B中只留下一个剩下加入A,A转为活跃,B弹出

进入:加入到活跃队列中

3. 代码

class MyStack {
    Queue<Integer> a;
    Queue<Integer> b;
    char alive;
    public MyStack() {
        a = new LinkedList<Integer>();
        b = new LinkedList<Integer>();
        alive = 'a';
    }

    public int changeQue(Queue<Integer> from, Queue<Integer> to){
        int size = from.size();
        // 导出,只留最后一个
        for(int i = 0; i < size-1; i++){
            int temp = from.remove();
            to.add(temp);
        }
        alive = alive == 'a'?'b':'a';
        return from.remove();
    }

    public void push(int x) {
        if(alive == 'a'){
            a.add(x);
        }else{
            b.add(x);
        }
    }
    
    public int pop() {
        int val = 0;
        if(alive == 'a'){
            val =  changeQue(a,b);
        }else{
            val = changeQue(b,a);
        }
        return val;
    }
    
    public int top() {
       int val = 0;
       if(alive == 'a'){
           val = changeQue(a,b);
           b.add(val);
            
        }else{
            val = changeQue(b,a);
            a.add(val); 
        } 
        return val;
    }
    
    public boolean empty() {
        if(a.isEmpty() && b.isEmpty()){
            return true;
        }
        return false;
    }
}

标签:04,val,队列,pop,int,push,public,empty
From: https://www.cnblogs.com/ylw-blogs/p/17818902.html

相关文章

  • 第二节:队列详解 和 面试题剖析
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • Java_消息队列_RocktMQ
    RocketMQ安装RocketMQ的安装包分为两种,二进制包和源码包sudoapt-getinstalldefault-jdksudoapt-getinstallmaven解耦,异步,削峰填谷异步消息可以作为解耦消息的生产和处理的一种解决方案部署:包括NameServer、Broker、Proxy组件NameServer需......
  • FreeRTOS(2):队列、信号量、互斥量
    1、队列 1.1数据传输方法任务之间如何传输数据 数据个数互斥措施阻塞-唤醒全局变量1无无环形缓冲区多个无无队列多个有有队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息。为什么不使用全局变......
  • React—04—状态管理
     有时候你希望两个组件的状态始终同步更改。要实现这一点,可以将相关状态从这两个组件上移除,并把这些状态移到最近的父级组件,然后通过props将状态传递给这两个组件。这被称为“状态提升”,这是编写React代码时常做的事。 事件一般以onXXX开头,比如内置元素div的click事件......
  • 洛谷P3046 海底高铁 巧用差分统计经过区间次数
    洛谷P3046海底高铁-差分统计经过区间次数题目贴在这里P3406海底高铁-洛谷|计算机科学教育新生态(luogu.com.cn)分析本题题干很长,但是题意理解很简单。就是给定n个节点,每次仅能在相邻的两个节点之间移动,且任意两个节点之间的高铁费用也不一样。依据题意,假设从3节点到1......
  • 从零开始构建报警中心:part04 钉钉消息-webhook
    现在工作上比较常用的IM一般式钉钉企微飞书,其实使用起来都是大同小异的。这里就用钉钉来实现。使用钉钉发送信息,一般有三种形式群webhook工作通知智能机器人智能机器人方式,能实现一定的交互功能,但逻辑相对复杂,这里只是需要一个实时的钉钉消息,所以不进行讨论。添加群webhook这是一......
  • 2008秋-计算机软件基础-循环顺序队列
    /*---------------------------------------------------------Title:SequenceQueue(顺序队列)顺序队列-顺序存储结构的队列请先阅读教材74-76页,2.4.1-2.4.3节,队列的定义及基本运算(注意:以下程序为简化后的,仅供入门学习之用)--------------------------------------......
  • 2008秋季-计算机软件基础-循环链队列
    /*---------------------------------------------------------Title:LinkQueue(链队列)链队列-链式存储结构的队列请先阅读教材74-77页,2.4.1-2.4.4节,队列的定义及基本运算(注意:以下程序为简化后的,仅供入门学习之用)---------------------------------------------......
  • 【面试题】消息队列面试题总结(RocketMQ版)
    自己整理、总结了一些消息队列相关面试题,并想了一些RocketMQ面试过程中可能会问的知识点。使用消息队列的优点系统解耦比如系统A产生的某个事件,系统B需要感知,简单实现就是在系统A产生事件之后,调用系统B的接口通知系统B,如果此时再增加一个系统C,还需要修改系统A的代码,再加入调用......
  • SP15637 GNYR04H - Mr Youngs Picture Permutations(线性 dp)
    题目求方案数,考虑dp——状态设计和边界——题目告诉了一个很显然的性质:每一排从左至右保证高度单调递减每一列从后往前保证高度单调递减那么可以发现,对于每一行,每一列,一定是按高度顺序插入,并且是连续插入,因为如果不连续,就无法保证单调递减的性质同时,它给出了另一个性......