代码随想录算法训练营 | 栈与队列part01

LeetCode第1047题删除字符串中的所有相邻重复项 题目来源 题目描述 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 示例: 输入:“abbaca” 输出:“ca” 解释: 例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。 提示: 阅读详情

232.用栈实现队列

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

class MyQueue {
public:
    MyQueue() {
        
    }
    
    void push(int x) {
        _stk1.push(x);
    }
    
    int pop() {
        if (_stk1.empty()) return -1;
        while (!_stk1.empty()) {
            _stk2.push(_stk1.top());
            _stk1.pop();
        }
        int ans = _stk2.top();
        _stk2.pop();
        while (!_stk2.empty()) {
            _stk1.push(_stk2.top());
            _stk2.pop();
        }
        return ans;
    }
    
    int peek() {
        while (!_stk1.empty()) {
            _stk2.push(_stk1.top());
            _stk1.pop();
        }
        int ans = _stk2.top();

        while (!_stk2.empty()) {
            _stk1.push(_stk2.top());
            _stk2.pop();
        }
        return ans;
    }
    
    bool empty() {
        if (_stk1.empty()) {
            return true;
        }
        else {
            return false;
        }
    }
private:
    stack<int> _stk1;
    stack<int> _stk2;
};

/**
 * 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();
 */

学会复用

class MyQueue {
public:
    MyQueue() {
        
    }
    
    void push(int x) {
        _stk1.push(x);
    }
    
    int pop() {
        if (_stk2.empty()) {
            if (_stk1.empty()) {
                return -1;
            }
            while (!_stk1.empty()) {
                _stk2.push(_stk1.top());
                _stk1.pop();
            }
        }
        int ans = _stk2.top();
        _stk2.pop();
        return ans;
    }
    
    int peek() {
        int ans = this->pop();
        _stk2.push(ans);
        return ans;
    }
    
    bool empty() {
        return _stk1.empty() && _stk2.empty();
    }
private:
    stack<int> _stk1;
    stack<int> _stk2;
};

/**
 * 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. 用队列实现栈

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 。
注意:
你只能使用队列的标准操作 —— 也就是 push to backpeek/pop from frontsizeis empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
两个队列实现

class MyStack {
public:
    MyStack() {

    }
    
    void push(int x) {
        _que1.push(x);
    }
    
    int pop() {
        if (_que1.empty()) {
            return -1;
        }
        while (_que1.size() > 1) {
            _que2.push(_que1.front());
            _que1.pop();
        }
        int ans = _que1.front();
        _que1.pop();
        while (!_que2.empty()) {
            _que1.push(_que2.front());
            _que2.pop();
        }
        return ans;
    }
    
    int top() {
        return _que1.back(); 
    }
    
    bool empty() {
        return _que1.empty();
    }
private:
    queue<int> _que1;
    queue<int> _que2;
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

一个队列实现
pop元素时,将_que1的头部的元素(除了最后一个元素外),重新添加到队尾

class MyStack {
public:
    MyStack() {

    }
    
    void push(int x) {
        _que1.push(x);
    }
    
    int pop() {
        if (_que1.empty()) {
            return -1;
        }
        int len = _que1.size();
        while (--len) {
            _que1.push(_que1.front());
            _que1.pop();
        }
        int ans = _que1.front();
        _que1.pop();
        return ans;
    }
    
    int top() {
        return _que1.back(); 
    }
    
    bool empty() {
        return _que1.empty();
    }
private:
    queue<int> _que1;
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

20. 有效的括号

https://leetcode.cn/problems/valid-parentheses/
给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        for (char c : s) {
            if (!stk.empty()) {
                if ((c == ')' && stk.top() == '(') || 
                    (c == ']' && stk.top() == '[') || 
                    (c == '}' && stk.top() == '{')) {
                    stk.pop();
                    continue;
                }
            }
            stk.push(c);

        }
        return stk.empty();
    }
};

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

https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"
栈的经典应用。

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> stk;
        for (char c : s) {
            if (!stk.empty()) {
                if (c == stk.top()) {
                    stk.pop();
                    continue;
                }
            }
            stk.push(c);
        }
        s.erase(s.begin(), s.end());
        while (!stk.empty()) {
            s += stk.top();
            stk.pop();
        }
        reverse(s.begin(),s.end());
        return s;
    }
};

字符串做栈

class Solution {
public:
    string removeDuplicates(string s) {
        string res;
        for (char c : s) {
            if (!res.empty() && c == res.back()) {
                res.pop_back();
            }
            else {
                res.push_back(c);
            }
        }
        return res;
    }
};
删除字符串中的所有相邻重复项 消消乐、或字符串、C++ 阅读详情

相关推荐

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

例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。4.将待压入的字符顶元素比较,相同时将顶元素弹出,不同时将待压字符压。是一个数组拷贝方法,可以将一个数组中的一部分拷贝到一个新数组中。5.遍历结束,返回中元素的倒序。

weixin_63541561的博客 1030

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

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 示例: 输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。 提示: 1 <

ganlanA的博客 1019

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

难度:中等 频次:17 题目: 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 解题思路:用辅助,更顶的数据比较,不相等就入,相等就出 代码: class Solution { public String removeDuplicates(String s) { Stack<Character> stack=ne

chenyson的博客 386

代码随想录算法训练营第9天|队列part01

第五章 队列part01,用模拟队列,用队列模拟,字符匹配括号匹配

zxjiaya的博客 1415

代码随想录算法训练营| 第五章 队列part01

的简单介绍:在C++中,stack是标准模板库(STL)中提供的一种数据结构,表示(stack),它通常用于后进先出(LIFO)的数据管理。: 这个操作用于将元素压入顶(即入操作)。例如,如果你有一个,你可以通过将整数5压入st的顶部。: 这个操作用于从顶移除元素(即出操作)。例如,如果你有一个非空的st,通过st.pop();将移除顶的元素。: 这个操作返回顶元素的引用,但不会移除它。这可以让你访问顶的元素而不改变的内容。例如,如果你有一个st,你可以通过st.top();

zhuanshu_ID_的博客 1015

代码随想录算法训练营 Day09 | 队列 part01

输入st1:专门接收新元素(push);输出st2:专门弹出 / 查看队首元素(pop/peek);倒数据规则:仅当st2为空时,才将st1所有元素一次性倒入st2。入队:1 → 2 → 3全部压入st1st2=[]执行popst2空,将st1倒入st2→弹出st2顶1,实现队首出队,符合 FIFO入:直接将元素加入队列尾部;出:将队列前 size-1 个元素依次移到队尾,此时队头元素就是顶,直接弹出;取顶:队列尾部元素就是顶元素。执行流程示例入:1 → 2 → 3。

2401_86818319的博客 484

代码随想录算法训练营第九天|队列part01

仅使用两个实现先入先出队列队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true;

欢迎光临花开富贵的博客 859

代码随想录算法训练营第10天 | 队列part01

本文总结了队列的基础知识及实现方式。遵循LIFO(后进先出)原则,队列遵循FIFO(先进先出)原则,两者都不支持遍历功能。通过C#代码示例展示了Stack和Queue的基本操作(Push/Pop和Enqueue/Dequeue)。文章强调在工业级代码开发中应避免复制粘贴,提倡抽象复用功能相近的代码。最后提到LeetCode第232题"用实现队列"的实践,体现了数据结构转换的应用。这些内容为算法训练提供了基础理论支持和实践指导。

such_ordinary的博客 259

代码随想录算法训练营Day10 | 队列part01

原文转载:0232.用实现队列C++中stack 是容器么?提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。 是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现的功能)。 所以STL中往往不被归类为容器,而被归类为container adapter(容器适配器)。 的内部结构,的底层实现可以是

xinghemubai的博客 424

代码随想录算法训练营第九天 | 队列 Part01

五,leetcode 1047 删除字符串中的所有相邻重复项。二,leetcode 232 用实现队列。三,leetcode 225 用队列实现。四,leetcode 020 有效的括号。

g724354的博客 474

代码随想录算法训练营Day10|队列part01

模拟队列,用队列模拟

weixin_57654532的博客 302

代码随想录算法训练营第天十天丨 队列part01

状态:已完成。

qq_67786627的博客 142

力扣第1047题 删除字符串中的所有相邻重复项 c++string stack巧解

给出由小写字母组成的字符串S会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。"abbaca""ca"例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。

lenyan~的博客 717

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

weixin_44750790的博客 943

代码随想录day11】删除字符串中的所有相邻重复项

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:"abbaca"输出:"ca"解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。

little_spice的博客 487

算法:删除字符串中的所有相邻重复项

注释已添加,多想多练,简单到有手就行!

ql_gome的博客 1139

《每日一题》1047. 删除字符串中的所有相邻重复项

class Solution { public: string removeDuplicates(string s) { stack<char> st; for (char S : s) { if (st.empty() || S != st.top()) { st.push(S); } else { st.pop(); // s ...

shawnlycheeo的博客 263
上一篇: 代码随想录算法训练营第六天| 字符串part02
下一篇: 代码随想录算法训练营 | 栈与队列part02
Fern_v
博客等级 码龄7年 288粉丝 · 45原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值