leetcode刷题 232, 225, 20, 1047

232.用栈实现队列

使用栈实现队列的下列操作:

push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。

说明:

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

class MyQueue {//栈1用于调整顺序实现先进先出,栈2用于暂时存储进入的元素
public:
    stack<int> s1;
    stack<int> s2;
    MyQueue() {
        
    }
    
    void push(int x) {
        s2.push(x);
    }
    
    int pop() {
        if(s1.empty()){//如果栈1全空,则将现在栈2所有的元素都分别出栈,并分别压入栈1中
            while(!s2.empty()){
                s1.push(s2.top());
                s2.pop();
            }
        }
        int x;
        if(!s1.empty()){
            x = s1.top();
            s1.pop();
            return x;
        }
            
        return -1;
    }
    
    int peek() {
        if(s1.empty()){
            while(!s2.empty()){
                s1.push(s2.top());
                s2.pop();
            }
        }
        int x = s1.top();
        return x;
    }
    
    bool empty() {
        return s1.empty() && s2.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();
 */

225. 用队列实现栈

使用队列实现栈的下列操作:

push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空
注意:

你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。

class MyStack {//出栈时将非空队列的元素除最后一个元素都放入另一个队列中,剩余的最后一个元素就是栈顶的元素
public:
    queue<int> q1;
    queue<int> q2;
    MyStack() {
        
    }
    
    void push(int x) {
        if(!q1.empty())
            q1.push(x);
        else
            q2.push(x);
    }
    
    int pop() {
        if(empty())
            return -1;
        int x;
        if(!q1.empty()){
            while(q1.size() != 1){
                x = q1.front();
                q1.pop();
                q2.push(x);
            }
            x = q1.front();
            q1.pop();
        }
        else{
            while(q2.size() != 1){
                x = q2.front();
                q2.pop();
                q1.push(x);
            }
            x = q2.front();
            q2.pop();
        }
        return x;
    }
    
    int top() {
        if(empty())
            return -1;
        int x;
        if(!q1.empty()){
            while(q1.size() != 1){
                x = q1.front();
                q1.pop();
                q2.push(x);
            }
            x = q1.front();
            q1.pop();
            q2.push(x);
        }
        else{
            while(q2.size() != 1){
                x = q2.front();
                q2.pop();
                q1.push(x);
            }
            x = q2.front();
            q2.pop();
            q1.push(x);
        }
        return x;
    }
    
    bool empty() {
        return q1.empty() && q2.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();
 */

20. 有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:

输入: "()"
输出: true
示例 2:

输入: "()[]{}"
输出: true
示例 3:

输入: "(]"
输出: false
示例 4:

输入: "([)]"
输出: false
示例 5:

输入: "{[]}"
输出: true

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        char ch;
        for(int i = 0; i < s.size(); ++i){
            switch(s[i]){
                case '(':
                case '{':
                case '[':
                    st.push(s[i]);
                    break;
                case ')':
                    if(!st.empty() && st.top() == '(')
                        st.pop();
                    else
                        return false;
                    break;
                case '}':
                    if(!st.empty() && st.top() == '{')
                        st.pop();
                    else
                        return false;
                    break;
                case ']':
                    if(!st.empty() && st.top() == '[')
                        st.pop();
                    else
                        return false;
                    break;
            }
        }
        return st.empty();
    }
};

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

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

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

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

示例:

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

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

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> st;
        if(s.size() > 0)
            st.push(s[0]);
        for(int i = 1; i < s.size(); ++i){
            if(!st.empty() && st.top() == s[i])
                st.pop();
            else
                st.push(s[i]);
        }
        string s1;
        while(!st.empty()){
            s1 += st.top();
            st.pop();
        }
        reverse(s1.begin(), s1.end());
        return s1;
    }
};

也可直接将要返回的字符串作为栈直接进行操作

class Solution {
public:
    string removeDuplicates(string s) {
        string s1;
        for(char ch : s){
            if(s1.empty() || ch != s1.back())
                s1.push_back(ch);
            else
                s1.pop_back();
        }
        return s1;
    }
};
posted @ 2025-02-03 21:00  arbiter9  阅读(11)  评论(0)    收藏  举报