算法学习——LeetCode力扣栈与队列篇1

算法学习——LeetCode力扣栈与队列篇1

在这里插入图片描述

232. 用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode)

描述

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

实现 MyQueue 类:

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

说明

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例

示例 1:

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

提示

  • 1 <= x <= 9
  • 最多调用 100 次 push、pop、peek 和 empty
  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)

进阶

你能否实现每个操作均摊时间复杂度为 O(1) 的队列?换句话说,执行 n 个操作的总时间复杂度为 O(n) ,即使其中一个操作可能花费较长时间。

代码解析

class MyQueue {
public:
    MyQueue() {
    }
    
    void push(int x) {
        s1.push(x);
    }
    
    int pop() {

        if(s2.empty() != 1) 
        {
            int result = s2.top();
            s2.pop();
            return result;
        }else
        {
              while(s1.empty() != 1)
            {
                int tmp = s1.top();
                s1.pop();
                s2.push(tmp);
            }
            int result = s2.top();
            s2.pop();
            return result;
        }  
    }
    
    int peek() {
        if(s2.empty() == 1)
        {
             while(s1.empty() != 1)
            {
                int tmp = s1.top();
                s1.pop();
                s2.push(tmp);
            }
        }
        return s2.top();
    }
    
    bool empty() {
        if(s1.empty() == 1 && s2.empty() == 1)
            return true;
        else 
            return false;
    }
public:
    stack<int> s1,s2;
};

/**
 * 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();
 * bool param_4 = obj->empty();
 */

225. 用队列实现栈

225. 用队列实现栈 - 力扣(LeetCode)

描述

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

实现 MyStack 类:

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

注意

你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例

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

提示

  • 1 <= x <= 9
  • 最多调用100 次 push、pop、top 和 empty
  • 每次调用 pop 和 top 都保证栈不为空

进阶

你能否仅用一个队列来实现栈。

代码解析

两个队列实现栈
#include <iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include <algorithm>
#include<map>
#include<stack>
#include <queue>
using namespace std;



class MyStack {
public:
    MyStack() {

    }

    void push(int x) {

        que_1.push(x);

    }

    int pop() {

        int result = 0;
        while (que_1.empty() == 0)
        {
            result = que_1.front();
            que_2.push(que_1.front());
            que_1.pop();
        }
        int num = que_2.size() - 1;
        for (int i = 0; i < num ; i++)
        {
            que_1.push(que_2.front());
            que_2.pop();
        }
           
        que_2.pop();
        return result;
    }

    int top() {

        int result = 0;
        while (que_1.empty() == 0)
        {
            result = que_1.front();
            que_2.push(que_1.front());
            que_1.pop();
        }
        while (que_2.empty() == 0)
        {
            que_1.push(que_2.front());
            que_2.pop();
        }
       
        return result;
    }

    bool empty() {

        if (que_1.empty() == 1)return 1;
        else return 0;
    }
public:
    queue<int> que_1;
    queue<int> que_2;
};



int main() {

    
    
     MyStack obj;
     obj.push(1);
     
     obj.push(2);
   
     obj.push(3);
     
    
     cout << obj.pop() << endl;
     cout << obj.pop() << endl;
     cout << obj.pop() << endl;
  
     cout << obj.empty() << endl;

     
      
     return 0;
   
}

一个队列实现栈

class MyStack {
public:
    MyStack() {

    }

    void push(int x) {

        que_1.push(x);

    }

    int pop() {

        int result = 0;
       
        int size  = que_1.size() -1 ;

        for (int i = 0; i < size; i++)
        {
            result = que_1.front();
            que_1.pop();
            que_1.push(result);
        }
        result = que_1.front();
        que_1.pop();
      
        return result;
    }

    int top() {

        int result = 0;

        int size = que_1.size() ;

        for (int i = 0; i < size; i++)
        {
            result = que_1.front();
            que_1.pop();
            que_1.push(result);
        }
       

        return result;
      
    }

    bool empty() {

        if (que_1.empty() == 1)return 1;
        else return 0;
    }
public:
    queue<int> que_1;
   
};

20. 有效的括号

20. 有效的括号 - 力扣(LeetCode)

描述

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

示例

示例 1:

输入:s = “()”
输出:true

示例 2:

输入:s = “()[]{}”
输出:true

示例 3:

输入:s = “(]”
输出:false

提示

  • 1 <= s.length <= 104
  • s 仅由括号 ‘()[]{}’ 组成

代码解析

遇到左括号压栈左括号
class Solution {
public:
    bool checkout( char &a , char &b ) //检查括号是否匹配
    {
        if (a == '(' && b == ')') return 1;
        else if (a == '[' && b == ']') return 1;
        else if (a == '{' && b == '}') return 1;
        else return 0;
    }

    bool isValid(string s) {

        stack<char> stack_s;
        stack_s.push(1);//防止空栈时top函数报错,提前压栈
        stack_s.push(s[0]);
        for (int i = 1; i < s.size(); i++)
        {
            if (checkout(stack_s.top(), s[i]) == 0) //不匹配压栈
            {
                stack_s.push(s[i]);
            }
            else//匹配弹栈
            {
                stack_s.pop();
            }
        }
        stack_s.pop();//弹出之前压的1
        return stack_s.empty();

    }
};

遇到左括号压栈右括号
class Solution {
public:
    bool isValid(string s) {
        if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求
        stack<char> st;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(') st.push(')');
            else if (s[i] == '{') st.push('}');
            else if (s[i] == '[') st.push(']');
            // 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
            // 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
            else if (st.empty() || st.top() != s[i]) return false;
            else st.pop(); // st.top() 与 s[i]相等,栈弹出元素
        }
        // 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
        return st.empty();
    }
};

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

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

描述

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例

输入:“abbaca”
输出:“ca”
解释:
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。

提示

  • 1 <= S.length <= 20000
  • S 仅由小写英文字母组成。

代码解析

返回原本的字符串
class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> stack_s;
        stack_s.push(1);
        stack_s.push(s[0]);
        for (int i = 1; i < s.size(); i++)
        {
            if (stack_s.top() != s[i])
            {
                stack_s.push(s[i]);
            }
            else
            {
                stack_s.pop();
            }
        }
        s.erase(0, s.size());
        int num = stack_s.size()-1;
        for(int i= 0 ;i < num; i++)
        { 
            s.insert(0,1,stack_s.top());//插入函数复杂度高,每一个点都执行浪费时间
            stack_s.pop();
        }
        
        return s;
            
    }
};

返回另一个串
class Solution {
public:
        string removeDuplicates(string s)
        {
            stack<char> stack_s;
            stack_s.push(1);
            stack_s.push(s[0]);
            for (int i = 1; i < s.size(); i++)
            {
                if (stack_s.top() != s[i])
                {
                    stack_s.push(s[i]);
                }
                else
                {
                    stack_s.pop();
                }
            }
            
            string result ="";
            int num = stack_s.size()-1;
            for(int i= 0 ; i < num; i++)
            { 
                result += stack_s.top();//倒叙插入,然后反转
                stack_s.pop();
            }
            reverse (result.begin(), result.end());//反转一次,节省时间
            
            return result;
        } 
    };

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动态水印怎么加 怎么去除动态水印 视频剪辑软件 会声会影安激活序列号 会声会影怎么剪辑视频

为了防止白嫖或者增加美观效果&#xff0c;视频制作者可能会采用动态水印的方式&#xff0c;让其他人难以盗取视频使用。动态水印的添加&#xff0c;需要应用到运动路径功能。接下来&#xff0c;本文会教大家动态水印怎么加&#xff0c;怎么去除动态水印的相关内容。感兴趣的小…

解析十六进制雷达数据格式:解析雷达数据长度。

以Cat62格式雷达数据为例&#xff0c;十六进制雷达数据部分代码&#xff1a; 3e0120bf7da4ffee0085 雷达数据长度使用4个字符&#xff08;2个字节&#xff09;标识&#xff0c;在这里是“0120”&#xff0c;转换为十进制数为288。 雷达数据长度父类&#xff1a; base_length_…

人工智能如何彻底改变身份欺诈

据 AuthenticID 称&#xff0c;近一半的企业报告合成身份欺诈有所增加&#xff0c;而生物识别欺骗和伪造 ID 欺诈尝试也有所增加。 在当今的数字化存在中&#xff0c;消费者和企业都面临着新的挑战&#xff0c;从考虑数字身份的影响到应对生成人工智能等新工具的使用和流行。与…

最高的牛(C++)

有 N头牛站成一行&#xff0c;被编队为 1、2、3…N每头牛的身高都为整数。 当且仅当两头牛中间的牛身高都比它们矮时&#xff0c;两头牛方可看到对方。 现在&#xff0c;我们只知道其中最高的牛是第 P 头&#xff0c;它的身高是 H &#xff0c;剩余牛的身高未知。 但是&#xf…

css2复合选择器

一.后代&#xff08;包含&#xff09;选择器&#xff08;一样的标签可以用class命名以分别&#xff09; 空格表示 全部后代 应用 二.子类选择器 >表示 只要子不要孙 应用 三.并集选择器 &#xff0c;表示 代表和 一般竖着写 应用 四.伪类选择器&#xff08;包括伪链接…

VR和AR傻傻分不清,一句话给你讲明白。

不说废话&#xff0c;直接说结论&#xff0c;虚拟现实&#xff08;Virtual Reality&#xff0c;VR&#xff09;和增强现实&#xff08;Augmented Reality&#xff0c;AR&#xff09;。如果现实是A&#xff0c;虚拟是B&#xff0c;那么VRB&#xff0c;ARAB&#xff0c;就这简单&…

基于javaEE的ssm仓库管理系统

仓库管理系统的重中之重是进销存分析这一板块&#xff0c;在这一板块中&#xff0c;顾名思义能够查询到近期的进货记录&#xff0c;包括每日的进货单据&#xff0c;单品推移(即某一商品的库存变化)&#xff0c;方便我们核对库存差异。同时也需要查询到每日的销售数据&#xff0…

hexo部署到gitee(码云)

引言 Hexo 是一个基于Node.js的静态博客框架&#xff0c;而 Gitee&#xff08;也被称为码云&#xff09;是一个国内的代码托管平台&#xff0c;支持 Git 版本控制系统&#xff0c;与 GitHub 类似。将 Hexo 部署到 Gitee Pages 可以让你的博客受益于 Gitee 的国内服务器&#xf…

ClickHouse--02--安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 安装官网 &#xff1b;[https://clickhouse.com/docs/zh/getting-started/install](https://clickhouse.com/docs/zh/getting-started/install)![在这里插入图片描述…

动态内存分配函数 | free为什么只传入一个指针就能正确释放

文章目录 1.Linux内存分布图2.C标准库中动态内存分配函数3.动态内存分配函数的常见错误 1.Linux内存分布图 在程序设计当中&#xff0c;可以定义全局变量也可以定以局部变量&#xff0c;分别也是在全局区、栈区开辟&#xff0c;那么这些区域都不有用我们动手管理&#xff0c;但…

【第六天】c++虚函数多态

一、多态的概述 多态按字面的意思就是多种形态。当类之间存在层次结构&#xff0c;并且类之间是通过继承关联&#xff08;父类与子类&#xff09;时&#xff0c;就会用到多态。 C 多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函数。 静态多态&…

Java图形化界面编程——菜单组件 笔记

2.7 菜单组件 ​ 前面讲解了如果构建GUI界面&#xff0c;其实就是把一些GUI的组件&#xff0c;按照一定的布局放入到容器中展示就可以了。在实际开发中&#xff0c;除了主界面&#xff0c;还有一类比较重要的内容就是菜单相关组件&#xff0c;可以通过菜单相关组件很方便的使用…

【Spring MVC篇】参数的传递及json数据传参

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、普通参数的传…

什么是智慧隧道,如何建设智慧隧道

一、隧道管理的难点痛点 近年来隧道建设规模不断扩大&#xff0c;作为隧道通车里程最多、规模最大的国家&#xff0c;截至2022年底&#xff0c;我国公路隧道共有24850处、2678.43万延米&#xff0c;其中特长隧道1752处、795.11万延米&#xff0c;长隧道6715处、1172.82万延米。…

【数学建模】【2024年】【第40届】【MCM/ICM】【C题 网球运动中的“动量”】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 MCM Problem C: Momentum in Tennis In the 2023 Wimbledon Gentlemen’s final, 20-year-old Spanish rising star Carlos Alcaraz defeated 36-year-old Novak Djokovic. The loss was Djokovic’s first at Wimbledon…

Android:Ionic框架使用实例

Ionic学习 ionic 是一个强大的 HTML5 应用程序开发框架(HTML5 Hybrid Mobile App Framework )。通过使用H5,JS,CSS构建接近原生体验的移动应用程序。 ionic放弃对IOS6和Android4.1以下的版本的支持,提高应用程序的运行效率。 Ionic官网地址: Ionic Framework - The Cross-Pla…

Vagrant 虚拟机工具基本操作指南

Vagrant 虚拟机工具基本操作指南 ​#虚拟机 #​ ​#vargant#​ ​#ubuntu#​ ‍ 虚拟机virtualbox ,VMWare及WSL等大家都很了解了&#xff0c;那Vagrant是什么东西&#xff1f; 它是一组命令行工具&#xff0c;可以象Docker管理容器一样管理虚拟机&#xff0c;这样快速创…

使用client-only 解决组件不兼容SSR问题

目录 前言 一、解决方案 1.基于Nuxt 框架的SSR应用 2.基于vue2框架的应用 3.基于vue3框架的应用 二、总结 往期回顾 前言 最近在我的单页面SSR应用上开发JSON编辑器功能&#xff0c;在引入组件后直接客户端跳转OK&#xff0c;但是在直接加载服务端渲染的时候一直报这…

基于springboot超市进销存系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;超市进销存系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而超…

IDEA中Git的使用小技巧-Toolbar(工具栏)的设置

目录 1 前言 2 步骤 2.1 打开设置 2.2 找到Menus and Toolbars 2.3 Menus and Toolbars界面的介绍 2.4 选择工具 2.5 查看 1 前言 工具栏的合理运用&#xff0c;能够极大程度上为我们省时省力 &#xff0c;接下来我将以Git工具的添加&#xff0c;介绍如何定制我们IDEA…
最新文章