首页 > 其他分享 >手撕代码之栈和队列

手撕代码之栈和队列

时间:2023-08-29 11:34:34浏览次数:38  
标签:return 队列 代码 之栈 pop stk stk1 stk2 empty



文章目录

  • 一、括号匹配(leetcode 20)
  • 二、最小栈(leetcode 155)
  • 三、两个栈实现一个队列(leetcode 232)


一、括号匹配(leetcode 20)

class Solution {
public:
    bool isValid(string s) {
        if (s.empty())
            return true;
        stack<char> stk;
        stk.push(s[0]);
        // 使用栈保存字符,如果新加入的字符与栈顶元素匹配则弹栈
        for (int i = 1; i < s.size(); ++i){
            if ( !stk.empty() && s[i] == ')' && stk.top() == '(' )
                stk.pop();
            else if ( !stk.empty() && s[i] == ']' && stk.top() == '[' )
                stk.pop();
            else if ( !stk.empty() && s[i] == '}' && stk.top() == '{' )
                stk.pop();
            else
                stk.push(s[i]);
        }
        if (!stk.empty())
            return false;
        else
            return true;
    }
};

二、最小栈(leetcode 155)

思路:使用辅助栈来实现,插入元素的时候先和minstack的栈顶元素比较,弹出元素的时候如果stack和minstack的栈顶元素相同,则弹出stack和minstack的栈顶元素。

class MinStack {
public:
    stack<int> stk, minstk;
    MinStack() { }
    
    void push(int x) {
        stk.push(x);
        if (minstk.empty() || x <= minstk.top())
            minstk.push(x);
    }
    
    void pop() {
        if (stk.top() == minstk.top())
            minstk.pop();
        stk.pop();
    }
    
    int top() {
        return stk.top();
    }
    
    int getMin() {
        return minstk.top();
    }
};

三、两个栈实现一个队列(leetcode 232)

思路:使用两个栈来实现,stack1负责插入元素,弹出元素的时候,首先判断stack2是否为空,如果不空直接弹出stack2的栈顶元素否则把stack1里面的元素全部弹出插入到stack2中

class MyQueue {
public:
    stack<int> stk1, stk2;
    MyQueue() { }
    
    void push(int x) {
        stk1.push(x);
    }

    int pop() {
        if (!stk2.empty()){
            int pop = stk2.top();
            stk2.pop();
            return pop;
        }
        else{
            while (!stk1.empty()){
                stk2.push(stk1.top());
                stk1.pop();
            }
            int pop = stk2.top();
            stk2.pop();
            return pop;
        }
    }
    
    int peek() {
        if (!stk2.empty()){
            return stk2.top();
        }
        else{
            while (!stk1.empty()){
                stk2.push(stk1.top());
                stk1.pop();
            }
            return stk2.top();
        }
    }
    
    bool empty() {
        if (stk1.empty() && stk2.empty()){
            return true;
        }
        return false;
    }
};


标签:return,队列,代码,之栈,pop,stk,stk1,stk2,empty
From: https://blog.51cto.com/u_6526235/7273895

相关文章

  • 手撕代码之二叉树
    文章目录一、根据排序数组构造二叉搜索树(leetcode108)二、根据前序遍历和中序遍历构造二叉树(leetcode105)三、二叉树的非递归遍历(leetcode94、144、145)四、二叉树中和为某一值的路径(leetcode112)五、二叉树的最大深度(leetcode104)六、二叉树的层次遍历(leetcode102)七、判断两个二......
  • Java代码审计之目录穿越
    一、目录穿越漏洞1、什么是目录穿越所谓的目录穿越指利用操作系统中的文件系统对目录的表示。在文件系统路径中,".."表示上一级目录,当你使用"../"时,你正在引用当前目录的上一级目录。如果你使用"../../",你实际上在两次".."的基础上,再次引用上一级目录,从而返回到上两级目录。......
  • 基于Redis的队列
    1.队列//发布@ApiOperation(value="put普通队列")@PostMapping("/queuePut")publicObjectput(@RequestBodyCommonMapRespDTOrespDTO){for(inti=0;i<20;i++){//队列RQueue<Object>queue=redissonClient.g......
  • redis 消息队列方案
    List实现消息队列使用LPUSH、RPOP左进右出或RPUSH、LPOP右进左出,实现消息顺序消费使用BLPOP、BRPOP这种阻塞式读取的命令,实现消息及时消费ack机制使用,使用index读取list的消息,正常消费完成后再使用POP删除//使用redission实现@Slf4j@ServicepublicclassQue......
  • 栈和队列在数据结构中的应用
    文章目录理解栈和队列的概念及其特点栈的应用和操作队列的应用和操作结论......
  • Vscode如何如何显示vue代码提示
    Vscode使用版本 下载这个插件 ......
  • 5.1.29 远程代码执行漏洞
    ThinkPHP55.0.22/5.1.29远程代码执行漏洞漏洞描述Thinkphp是一个国内轻量级的开发框架。由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。验证方式直接访问http://your-ip:8080/index.php?s=/Index/\thi......
  • 队列和栈
    队列和栈是两种常见的数据结构,常用于存储和操作数据的方式。它们有不同的特点和用途。队列(Queue)是一种先进先出(First-In-First-Out,FIFO)的数据结构。可以将其想象成排队的人群,仅允许在队尾插入元素,从队头移除元素。新元素总是加入到队列的末尾,而最先加入的元素会最先被移除。队列......
  • python代码画爱心❤(海龟)
    importturtle#设置标题turtle.title("蜜蜂的程序")turtle.st()#显示海龟print(turtle.position())turtle.color("red","pink")turtle.begin_fill()#填充前turtle.left(90)turtle.penup()turtle.pendown()turtle.circle(60,180)turtle.circle(18......
  • 代码随想录第6天|242.有效的字母异位词;349.两个数组的交集;202.快乐数;1.两数之和;
     unordered_map<int,int>map;  unordered_set<int>result;vector<vector<int>>res(n,vector<int>(n,0));声明了长度为n*n的二维数组在C++中,auto是一个关键字,用于实现类型推导,使编译器能够根据变量的初始化表达式来自动推断其数据类型。它在C++11标准中引入,......