代码随想录算法训练营第9天|232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

LeetCode232

2025-01-30 21:56:19 星期四

题目描述:力扣232
文档讲解:代码随想录(programmercarl)232.用栈实现队列
视频讲解:《代码随想录》算法视频公开课:栈的基本操作! | LeetCode:232.用栈实现队列

代码随想录视频内容简记

梳理

  1. push()函数直接stackIN入栈来模拟就可以。两个栈来模拟

  2. pop()函数需要用到两个栈

  3. peek()函数可以直接函数复用,调用pop()函数来进行查询,之后再重新添加进去即可

  4. empty()直接查询

大致代码内容

  1. 关于pop()函数的实现,首先要判断stackOut是否是空,只有为空才能从stackIn中弹出,if (stackOut.empty())

  2. stackOut为空的时候,需要一次性从stackIn中弹出所有的元素,并进入stackOut。因为stackOut不为空的话顺序就不一样了。


if (stackOut.empty()) {
	while (!stackIn.empty()) {
		stackOut.push(stackIn.top());
		stackIn.pop();
	}
}
  1. 需要弹出stackOut的栈顶元素

int result;
int result = stackOut.top();
stackOut.pop();

LeetCode测试

点击查看代码
class MyQueue {
public:
    stack<int> stackIn;
    stack<int> stackOut;

    MyQueue() {
        
    }
    
    void push(int x) {
        stackIn.push(x);
    }
    
    int pop() {
        if (stackOut.empty()) {
            while (!stackIn.empty()) {
                stackOut.push(stackIn.top());
                stackIn.pop();
            }
        }
        int result;
        result = stackOut.top();
        stackOut.pop();
        return result;
    }
    
    int peek() {
        int result;
        result = this->pop();
        stackOut.push(result);
        return result;
    }
    
    bool empty() {
        return stackIn.empty() && stackOut.empty();
    }
};

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

LeetCode225

题目描述:力扣225
文档讲解:代码随想录(programmercarl)225. 用队列实现栈
视频讲解:《代码随想录》算法视频公开课:队列的基本操作! | LeetCode:225. 用队列实现栈

代码随想录视频内容简记

用队列实现栈只需要用到一个队列就可以实现

梳理

  1. push()函数直接调用队列的push()即可

  2. pop()函数只需要将

  3. top()实现只需要调用队列的back()函数

  4. empty()就是队列的empty()函数

大致代码内容

  1. 实现pop()函数的时候注意我们不需要按照一个栈的顺序完整地输出,只需要弹出最后的一个元素,其余的元素顺序不变即可。

  2. size = queue.size(),首先获取队列的长度,size--之后while (size--)进入循环。注意在循环中不要忘了把每次弹出的元素再添加到队列中去

  3. queue.front()获取此时第一个元素之后,最后不要忘了用queue.pop()弹出才能return返回

LeetCode测试

点击查看代码
class MyStack {
public:
    queue<int> queue;

    MyStack() {
        
    }
    
    void push(int x) {
        queue.push(x);
    }
    
    int pop() {
        int size = queue.size();
        int result;
        size--;
        while (size--) {
            result = queue.front();
            queue.pop();
            queue.push(result);
        }
        result = queue.front();
        queue.pop();
        return result;
    }
    
    int top() {
        return queue.back();
    }
    
    bool empty() {
        return queue.empty();
    }
};

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

LeetCode20

题目描述:力扣20
文档讲解:代码随想录(programmercarl)20. 有效的括号
视频讲解:《代码随想录》算法视频公开课:栈的拿手好戏!| LeetCode:20. 有效的括号

代码随想录视频内容讲解

梳理

  1. 剪枝。这道题目可以进行剪枝的操作就是,如果这个字符串的长度不是偶数,那么就一定不是一个有效的字符串

  2. 三种括号类型不匹配的情况

    1. 左括号出现多余,例如:([{}]

    2. 右括号出现多余,例如:[{}])

    3. 左右括号不相等,例如:[{)}]

  3. 首先是if判断左括号的三种情况,分别转换成右括号

  4. else判断右括号,能够判断右括号出现多余左右括号不相等的两种情况

  5. 循环结束,判断左括号出现多余的情况

大致代码内容

  1. 首先是一个for循环遍历整个字符串。如果出现对应的左括号,在栈中添加对应的右括号,这么做的目的是为了进行下一步的相等判断。出现对应的右括号,弹出栈顶元素。

  2. 如果右括号出现多余if (stack.empty()),那么就是在遍历还未结束的时候,就出现了栈为空的情况

  3. 如果左右括号不相等if (s[i] != stack.top())

  4. 如果左括号不相等,则需要等待循环遍历结束之后,发现栈中不为空

LeetCode测试

在测试的时候,写成了这样的判断条件:if (s[i] != stack.top() || stack.empty()),在遇到一个用例)[的时候出现了

这里就是对一个空栈取元素报异常了,所以这个顺序一定不能反过来写if (stack.empty() || s[i] != stack.top())

有效的括号完整代码如下:

点击查看代码
class Solution {
public:
    bool isValid(string s) {
        stack<int> stack;
        if (s.size() % 2 != 0) return false;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '[') stack.push(']');
            else if (s[i] == '(') stack.push(')');
            else if (s[i] == '{') stack.push('}');
            else {
                if (stack.empty() || s[i] != stack.top()) return false; 
                stack.pop();
            }
        }
        if (!stack.empty()) return false;
        return true;
    }
};

LeetCode1047

题目描述:力扣1047
文档讲解:代码随想录(programmercarl)1047. 删除字符串中的所有相邻重复项
视频讲解:《代码随想录》算法视频公开课:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项

代码随想录视频内容简记

假设字符串为abbaca

梳理

  1. 为了判断一个元素有没有和他相等的在他之前出现过,需要有一个结构来进行存储之前遍历过的的元素,然后每当有元素和这个结构里的有相等,就对其进行删除。最后留下的就是不相等的元素

  2. 之后进入循环

  3. 首先是队空的情况,可以压入一个字符

  4. 如果字符串遍历的字符和栈顶的字符不相等,则压入一个字符;如果相等,则栈中元素弹出

  5. 最后返回的栈中字符,弹出后需要进行反向输出,就是原字符串

  6. 注意:因为最后的输出不方便,k哥最后说用字符串来模拟一个栈进行操作。也就是原字符串s依然从头部开始遍历,但是在组成result目标字符串时从尾部开始

大致代码内容

注意:

  1. if (s.empty() || s[i] != result.back()) result.push_back(s.back())

  2. 如果最后是相等,则 result.pop_back()

  3. 最后的returnresult就是从头部返回的ac

LeetCode测试

点击查看代码
class Solution {
public:
    string removeDuplicates(string s) {
        string result;
        for (int i = 0; i < s.size(); i++) {
            if (result.empty() || s[i] != result.back()) result.push_back(s[i]);
            else result.pop_back();
        }
        return result;
    }
};
posted on   bnbncch  阅读(1717)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示