《剑指Offer》模块4 栈和队列

news2024/11/18 8:47:56

栈和队列

1. 用两个栈实现队列

原题链接

补充:copy(a,b) 把a赋值给b

在这里插入图片描述
在这里插入图片描述

class MyQueue {
public:
    /** Initialize your data structure here. */
    stack<int> stk, cache;
    MyQueue() {

    }

    /** Push element x to the back of queue. */
    void push(int x) {
        stk.push(x);
    }

    void copy(stack<int> &a, stack<int> &b) {
        while (a.size()) {
            b.push(a.top());
            a.pop();
        }
    }

    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        copy(stk, cache);
        int res = cache.top();
        cache.pop();
        copy(cache, stk);
        return res;
    }

    /** Get the front element. */
    int peek() {
        copy(stk, cache);
        int res = cache.top();
        copy(cache, stk);
        return res;
    }

    /** Returns whether the queue is empty. */
    bool empty() {
        return stk.empty();
    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * bool param_4 = obj.empty();
 */
class MyQueue {

    Stack<Integer> inStack;
    Stack<Integer> outStack;
    /** Initialize your data structure here. */
    public MyQueue() {
        inStack = new Stack<>();
        outStack = new Stack<>();
    }

    /** Push element x to the back of queue. */
    public void push(int x) {
        inStack.push(x);
    }

    /** Removes the element from in front of queue and returns that element. */
    public int pop() {
        while(!inStack.isEmpty()){
            outStack.push(inStack.pop());
        }
        int tmp = outStack.pop();
        while(!outStack.isEmpty()){
            inStack.push(outStack.pop());
        }
        return tmp;
    }

    /** Get the front element. */
    public int peek() {
        while(!inStack.isEmpty()){
            outStack.push(inStack.pop());
        }
        int res = outStack.peek();
        while(!outStack.isEmpty()){
            inStack.push(outStack.pop());
        }
        return res;
    }

    /** Returns whether the queue is empty. */
    public boolean empty() {
        return inStack.isEmpty() && outStack.isEmpty();
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */

2. 包含min函数的栈

原题链接
在这里插入图片描述
本题我们用样例说话

  1. 比如是 1 2 3 4 5
    那么对应的最小栈就是 1
  2. 如果是 5 4 3 2 1
    对应就是 5 4 3 2 1
  3. 如果是 3 1 2 4 5
    对应是 3 1

所以我们创建一个最小栈
如果入栈的值 小于 栈顶的值
就入最小栈

否则只入栈,不入最小栈

当最小栈和普通栈的栈顶一样时 出栈

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> stackValue;
    stack<int> stackMin;
    MinStack() {

    }

    void push(int x) {
        stackValue.push(x);
        if (stackMin.empty() || stackMin.top() >= x)
            stackMin.push(x);
    }

    void pop() {
        if (stackMin.top() == stackValue.top()) stackMin.pop();
        stackValue.pop();
    }

    int top() {
        return stackValue.top();
    }

    int getMin() {
        return stackMin.top();
    }
};

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

3. 栈的压入、弹出序列

原题链接

在这里插入图片描述

class Solution {
public:
    bool isPopOrder(vector<int> pushV,vector<int> popV) {
        if(popV.size() != pushV.size())
        {
            return false;
        }
        if(pushV.size()==0 && popV.size()==0)
            return true;
        stack<int> st;
        for(int i = 0,j = 0; i < popV.size(); i++)
        {
            if(popV[j]!=pushV[i])
            {
                st.push(pushV[i]);
            }
            else
            {
                st.push(pushV[i]);
                while(st.size() && j < popV.size() && st.top() == popV[j])
                {
                    st.pop();
                    j++;
                }
            }
        }
        if(st.size()==0)
            return true;
        return false;
    }
};
class Solution {
    public boolean isPopOrder(int [] pushV,int [] popV) {
        // 如果两个数组为空, 直接返回true, 两个数组长度不等, 返回false
        if(pushV == null && popV == null){
            return true;
        }
        if(pushV.length != popV.length){
            return false;
        }
        // 新建一个栈, 将push一个一个放入, 并判断
        // 如果元素与popV的top元素相等, 则弹出popV, 否则继续在stack里放元素
        // 如果顺序正确的话, PopV应该会为空值
        Stack<Integer> stack = new Stack<>();
        int index = 0;
        for(int i = 0; i< popV.length; i++){
            stack.push(pushV[i]);
            while(!stack.isEmpty() && stack.peek() == popV[index]){
                stack.pop();
                index++;
            }
        }
        return stack.isEmpty();
    }
}

4. 数据流中的中位数( 大根堆 + 小根堆 )

原题链接

在这里插入图片描述
在这里插入图片描述

class Solution {
public:

    priority_queue<int> maxheap;
    priority_queue<int, vector<int>, greater<int> > minheap;

    void insert(int x){
        maxheap.push(x);
        if(minheap.size() && maxheap.top() > minheap.top())  // **1
        {
            int maxe = maxheap.top(), mine = minheap.top();
            maxheap.pop(), minheap.pop();
            maxheap.push(mine), minheap.push(maxe);
        }

        if(maxheap.size() > minheap.size() + 1)
        {
            minheap.push(maxheap.top());
            maxheap.pop();
        }
    }

    double getMedian(){
        if((maxheap.size() + minheap.size()) & 1) return maxheap.top();
        else return (maxheap.top() + minheap.top()) / 2.0;
    }
};
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
/*
    最大堆保存左半部分,即较小一半
    最小堆保存右半部分,即较大一半
    但是新插入数据可能会比最大堆中最大的数字要小,
    也可能会比最小堆中最小的数字要大,
    因此先将数字放入最大堆,然后将最大堆中最大的数字放入最小堆
    (也可先将数字放入最小堆,然后将最小堆中最小的数字放入最大堆)
    这样始终保持,最大堆中最大的数字,比最小堆最小的数字还要小。
    同时控制数字数量,保证最大堆的容量与最小堆的容量差距不超过1
    这样最终如果最大堆的容量较大,则直接返回最大堆顶,
    否则两个堆顶数字相加除以2.0(返回double)
*/
class Solution {

    Queue<Integer> maxHeap = new PriorityQueue<>((a,b)->b-a);
    Queue<Integer> minHeap = new PriorityQueue<>();
    public void insert(Integer num) {
        maxHeap.add(num);
        minHeap.add(maxHeap.poll());
        if(maxHeap.size() < minHeap.size()){
            maxHeap.add(minHeap.poll());
        }
    }

    public Double getMedian() {
        return maxHeap.size() > minHeap.size() 
               ? maxHeap.peek()
               : (maxHeap.peek() + minHeap.peek()) / 2.0;
    }

}

5. 圆圈中最后剩下的数字【全部入队列】

原题链接
在这里插入图片描述
直接维护一个队列来做:
每走过一步,就把队首元素放到队列的后面,每走完m步把队列头元素删除
直到进行完n-1次迭代

class Solution {
public:
    int lastRemaining(int n, int m){
        queue<int> q;
        for(int i = 0;i < n; i++) q.push(i);
        int cnt = 0;
        int s = q.size();
        while(cnt < n - 1){
        int curr = 0;//curr表示当前走了多少步
           while(curr < m - 1){ //每次从0开始走m-1步
               int t = q.front();
               q.pop();
               q.push(t);
               curr ++;
           }//循环结束说明当前走到了第m个元素
           q.pop();//把第m个元素删掉
           cnt ++;
        }

        return q.front();//删完n-1个元素,队列里剩下的就是最后一个元素,返回它
    }
};

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

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

相关文章

“分布式”与“集群”初学者的技术总结

一、“分布式”与“集群”的解释&#xff1a; 分布式&#xff1a;把一个囊肿的系统分成无数个单独可运行的功能模块 集群&#xff1a; 把相同的项目复制进行多次部署&#xff08;可以是一台服务器多次部署&#xff0c;例如使用8080部署一个&#xff0c;8081部署一个&#xff0c…

vue拖拽div盒子实现上下拖动互换

vue拖拽div盒子实现上下拖动互换 <div v-for"(item, index) in formList" :key"index" draggable"true"dragstart"handleDragStart($event, item)"dragenter"handleDragEnter($event, item)"dragover.prevent"han…

如何在vscode导入下载的插件安装包

点击vscode插件 --> 点击3个点 --> 选择从VSIX安装 点击更新报 Cannot update while running on a read-only volume. The application is on a read-only volume. Please move the application and try again. If you’re on macOS Sierra or later, you’ll need to m…

清吧全面解析,从此不再困惑

清吧&#xff08;Bar&#xff09;也叫休闲酒吧&#xff0c;是以轻音乐为主、比较安静的酒吧&#xff0c;比较适合和朋友一起谈天说地、喝酒聊天。清吧的装修风格偏向营造氛围&#xff0c;不如其他酒吧炫目。通常清吧这一类的酒吧不提供食品&#xff0c;仅提供酒水和饮料。通常清…

性价比神机!南卡新品OE CC开放式耳机上线,彻底把门焊死了!

开放式耳机,作为今年大热的产品,以其高舒适性在蓝牙耳机市场大放异彩,但是同时用户也反应出存在音质不足、漏音、通话质量差等多项问题&#xff0c;最重要的还是成熟的开放式产品价格偏贵&#xff0c;导致入门门槛相对较高。针对这些问题,开放式音频专业品牌南卡则是以产品力革…

keepalive+haproxy实现高可用

1&#xff0c;两台主机安装keepalived 配置keepalived 安装haproxy make PREFIX/usr/local/haproxy TARGETlinux2628 make install PREFIX/usr/local/haproxy 创建配置文件 配置haproxy vim /etc/haproxy/haproxy.cfg 添加为系统服务 cp /root/haproxy-1.7.2/examples/hapro…

解决抖音semi-ui的Input无法获取到onChange事件

最近在使用semi-ui框架的Input实现一个上传文件功能时遇到了坑&#xff0c;就是无法获取到onChange事件&#xff0c;通过console查看只是拿到了一个文件名。但若是把<Input>换成原生的<input>&#xff0c;就可以正常获取到事件。仔细看了下官方文档&#xff0c;发现…

【Linux】动态库和静态库

动态库和静态库 软链接硬链接硬链接要注意 自定义实现一个静态库(.a)解决、使用方法静态库的内部加载过程 自定义实现一个动态库&#xff08;.so&#xff09;动态库加载过程 静态库和动态库的特点 软链接 命令:ln -s 源文件名 目标文件名 软链接是独立连接文件的&#xff0c;他…

10.Redis数据结构之跳表

sortedSet sortedSet是Redis提供的一个非常特别的数据结构&#xff0c;常用作排行榜等功能&#xff0c;将用户id作为value&#xff0c;关注时间或者分数作为score进行排序。 与其他数据结构相似&#xff0c;zset也有两种不同的实现&#xff0c;分别是zipList和(hashskipList)。…

打造跨境电商新引擎:揭秘跨境电商系统商城软件平台源码

跨境电商系统商城软件平台的意义与需求 跨境电商正成为全球贸易发展的重要驱动力&#xff0c;然而&#xff0c;建立和运营一个成功的跨境电商平台并非易事。在这个过程中&#xff0c;跨境电商系统商城软件平台的作用日益凸显。 跨境电商系统商城软件平台源码是构建一个完整、高…

关于 ts 这一篇文章就够了

你好 文章目录 一、js 和 ts二、TypeScript的特点三、了解 ts , 爱上 ts &#x1f923; 一、js 和 ts 随着近几年前端领域的快速发展&#xff0c;JavaScript 迅速被普及和受广大开发者的喜爱&#xff0c;借助于 JavaScript 本身的强大&#xff0c;也让使用JavaScript开发的人员…

java八股文面试[JVM]——JVM内存结构2

知识来源&#xff1a; 【2023年面试】JVM内存模型如何分配的_哔哩哔哩_bilibili

PRACK消息

概述 PRACK消息是sip协议的扩展&#xff0c;在RFC3262中定义&#xff0c;标准的名称是sip协议中的可靠临时响应。 本文简单介绍标准中对PRACK消息流程的描述&#xff0c;以及fs配置PRACK的方式。 环境 centos&#xff1a;CentOS release 7.0 (Final)或以上版本 freeswitc…

开放式耳机百元旗舰标杆,性能小钢炮南卡OE CC开放式耳机上线!

近日&#xff0c;南卡再次以领先的姿态推出了百元级性能小钢炮&#xff0c;全新NANK南卡OE-CC耳机。这款耳机不仅延续了南卡一贯的创新精神&#xff0c;更是为用户带来了卓越的音质和性能体验。南卡OE-CC的上线&#xff0c;再次彰显了南卡作为行业先驱者的地位&#xff0c;为用…

中科驭数受邀在招商银行金融科技论坛作异构计算主题分享 解码金融科技先进算力构建之路

8月25日&#xff0c;2023招银浦江金融科技论坛正式召开。中科驭数高级副总裁张宇受邀在资管科技分论坛发表《金融行业先进异构算力底座构建之路》的主题演讲&#xff0c;与参会嘉宾分享了当前计算系统的发展趋势以及如何通过异构算力构建IT技术底座来推动金融科技的创新。 ▲ 中…

行政如何借助ChatGPT提高效率

文章目录 ChatGPT的优势与局限行政人员的核心价值行政人员应对策略借助ChatGPT提高效率结论 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的个人社区 &a…

WPF基础入门-Class4-WPF绑定

WPF基础入门 Class4&#xff1a;WPF绑定 1、cs文件中设置需要绑定的数据&#xff1a; public partial class Class_4 : Window{public Class_4(){InitializeComponent();List<Color> test new List<Color>();test.Add(new Color() { Code "Yellow",…

Mybatis-Plus 代码自动生成器 整合springboot

Pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

修改Jupyter Notebook默认打开路径

这里我是重新下载的anaconda&#xff0c;打开Jupyter之后是默认在C盘的一个路径的&#xff0c;现在我们就来修改一下它的一个默认打开路径&#xff0c;这样在我们后续学习过程中&#xff0c;可以将ipynb后缀的文件放在这个目录下就能查看了。 1、先打开Anaconda Prompt&#x…

【已解决】Windows11给IPad或IPhone拷贝文件

问题&#xff1a; 想要把电脑的PDF学习的文件拷贝到IPad上 解决办法&#xff1a; 电脑以win11为例&#xff0c;语言我调成英文用了&#xff0c;大家可以自行翻译对应。 创建账户 1、新建一个账户用于共享专用。点击settings-Accounts-Others Users-Add account&#xff0c…