首页 > 其他分享 >leetcode:栈和队列oj题

leetcode:栈和队列oj题

时间:2024-10-19 19:17:21浏览次数:7  
标签:return oj 队列 pop queue1 int leetcode empty

目录

1.有效的括号

2.用队列实现栈                                                                              

3.用栈实现队列                                                                              

4.设计循环队列                                                                             


1.有效的括号

https://leetcode.cn/problems/valid-parentheses/solutions/373578/you-xiao-de-gua-hao-by-leetcode-solution/                                                                                  

        这道题用栈比较好解决,当我们遇到左括号时,就将其入栈,遇到右括号时,出栈与之匹配,如果匹配成功就返回true匹配下一个,直到栈为空返回false,遍历结束.为了方便我们可以将括号存入哈希表,键为右括号,值为左括号.其中如果栈中数据为奇数,我们直接返回false即可,因为不可能匹配成功, 注意:这道题形如"([{}])"是可以匹配成功,但是"[{]}"这种是错误的                                                             

                                                              

                                                                                      

class Solution {
public:
    bool isValid(string s) {
        int n=s.size();
        if(n%2==1)
            return false;

        unordered_map<char,char>pairs={
            {')','('},
            {']','['},
            {'}','{'}
        };

        stack<char> stk;
        for(char ch:s)
        {
            if(pairs.count(ch))
            {
                if(stk.empty()||stk.top()!=pairs[ch])
                    return false;
                stk.pop();
            }
            else
                stk.push(ch);
        }
        return stk.empty();
    }
};

2.用队列实现栈                                                                              

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

        入栈操作时,首先将元素入队到 queue2,然后将 queue1的全部元素依次出队并入队queue2,此时queue2的前端的元素即为新入栈的元素.再将 queue1和queue2互换,则 queue1的元素即为栈内的元素,queue1的前端和后端分别对应栈顶和栈底.由于每次入栈操作都确保queue1的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现.出栈操作只需要移除 queue1的前端元素并返回即可,获得栈顶元素操作只需要获得 queue1的前端元素并返回,queue1用于存储栈内的元素,判断栈是否为空时,只需要判断 queue 1 是否为空即可

   

class MyStack {
public:
    queue<int> queue1;
    queue<int> queue2;

    void push(int x) {
        queue2.push(x);
        while (!queue1.empty()) {
            queue2.push(queue1.front());
            queue1.pop();
        }
        swap(queue1, queue2);
    }
    
    
    int pop() {
        int r = queue1.front();
        queue1.pop();
        return r;
    }
    
   
    int top() {
        int r = queue1.front();
        return r;
    }
    
    
    bool empty() {
        return queue1.empty();
    }
};

3.用栈实现队列                                                                              

https://leetcode.cn/problems/implement-queue-using-stacks/solutions/632369/yong-zhan-shi-xian-dui-lie-by-leetcode-s-xnb6/         这道题的解法与上题类似,将一个栈当作输入栈,用于压入 push 传入的数据;另一个栈当作输出栈,用于 pop 和 peek 操作。每次 pop 或 peek 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序

       

class MyQueue {
private:
    stack<int> Stack1, Stack2;

    void in2out() {
        while (!Stack2.empty()) {
            Stack1.push(Stack2.top());
            Stack2.pop();
        }
    }

public:
    MyQueue() {}

    void push(int x) {
        Stack2.push(x);
    }

    int pop() {
        if (Stack1.empty()) {
            in2out();
        }
        int x = Stack1.top();
        Stack1.pop();
        return x;
    }

    int peek() {
        if (Stack1.empty()) {
            in2out();
        }
        return Stack1.top();
    }

    bool empty() {
        return Stack2.empty() && Stack1.empty();
    }
};

4.设计循环队列                                                                             

          https://leetcode.cn/problems/design-circular-queue/description/                                             

        我们用链表实现队列,入队列时,将新的元素插入到链表的尾部,出队列时,将链表的头节点返回,并将头节点指向下一个节点

           

class MyCircularQueue {
private:
    ListNode *head;
    ListNode *tail;
    int capacity;
    int size;

public:
    MyCircularQueue(int k) {
        this->capacity = k;
        this->size = 0;
        this->head = this->tail = nullptr;
    }

    bool enQueue(int value) {
        if (isFull()) {
            return false;
        }
        ListNode *node = new ListNode(value);
        if (!head) {
            head = tail = node;
        } else {
            tail->next = node;
            tail = node;
        }
        size++;
        return true;
    }

    bool deQueue() {
        if (isEmpty()) {
            return false;
        }
        ListNode *node = head;
        head = head->next;  
        size--;
        delete node;
        return true;
    }

    int Front() {
        if (isEmpty()) {
            return -1;
        }
        return head->val;
    }

    int Rear() {
        if (isEmpty()) {
            return -1;
        }
        return tail->val;
    }

    bool isEmpty() {
        return size == 0;
    }

    bool isFull() {
        return size == capacity;
    }
};

            

标签:return,oj,队列,pop,queue1,int,leetcode,empty
From: https://blog.csdn.net/w200514/article/details/143080162

相关文章

  • LeetCode热题100|买卖股票的最佳时机(贪心)
    简述题意省流版:在一个序列里找到max(a[i]-a[k])且i>k。解题思路:  遍历这个序列,i表示当前遍历到了第i个元素,min1表示1到i这个范围内最小的元素,max1表示1到i这个范围内最大的【max(a[i]-a[k])】。max1=max(max1,第i个元素的值-min1)代码如下:classSolution{public:intm......
  • LeetCode 707 - 设计链表
    题目描述你可以选择使用单链表或者双链表,设计并实现自己的链表。单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 ......
  • 延迟队列实现及其原理详解
    1.绪论本文主要讲解常见的几种延迟队列的实现方式,以及其原理。2.延迟队列的使用场景延迟队列主要用于解决每个被调度的任务开始执行的时间不一致的场景,主要包含如下场景:1.比如订单超过15分钟后,关闭未关闭的订单。2.比如用户可以下发任务,并且可以自定义任务的开始时间。3......
  • UOJ 80:二分图最大权匹配 ← KM算法
    【KM算法简介】Kuhn-Munkres算法,简称KM算法,是用于“二分图带权最大匹配问题”的经典算法。【题目来源】https://uoj.ac/problem/80【题目描述】从前一个和谐的班级,有nl个是男生,有nr个是女生。编号分别为1,……,nl和1,……,nr。有若干个这样的条件:第v个男生......
  • Leetcode 1129. 颜色交替的最短路径
    1.题目基本信息1.1.题目描述给定一个整数n,即有向图中的节点数,其中节点标记为0到n–1。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。给定两个数组redEdges和blueEdges,其中:redEdges[i]=[a_i,b_i]表示图中存在一条从节点a_i到节点b_i的红色有向边,bl......
  • Leetcode 1135. 最低成本连通所有城市
    1.题目基本信息1.1.题目描述想象一下你是个城市基建规划者,地图上有n座城市,它们按以1到n的次序编号。给你整数n和一个数组conections,其中connections[i]=[x_i,y_i,cost_i]表示将城市x_i和城市y_i连接所要的cost_i(连接是双向的)。返回连接所有城市的最低成本,......
  • 【leetcode】 码住—两种办法解决力扣数学思想 “加一” 操作
     前言......
  • LeetCode题练习与总结:最大单词长度乘积--318
    一、题目描述给你一个字符串数组 words ,找出并返回 length(words[i])*length(words[j]) 的最大值,并且这两个单词不含有公共字母。如果不存在这样的两个单词,返回 0 。示例 1:输入:words=["abcw","baz","foo","bar","xtfn","abcdef"]输出:16解释:这两个单词为"abc......
  • LeetCode题练习与总结:灯泡开关--319
    一、题目描述初始时有 n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭第二个。第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开)。第 i 轮,你每 i 个灯泡就切换第 i 个灯泡的开关。直到第 n 轮,你只需要切换......
  • LeetCode刷题日记之贪心算法(二)
    目录前言买卖股票的最佳时机II跳跃游戏跳跃游戏II总结前言在上一篇贪心算法的学习中,我们探讨了贪心算法的基本思路和逻辑框架。在这篇文章中,我将继续分享几道经典的LeetCode贪心算法题,并探讨其背后的解题思路和技巧。希望通过这些题目的实践,能加深我对贪心算法的理......