代码随想录day10

232.用栈实现队列

//理解2个栈 一个栈弹出后再入另一个栈,再弹出即可实现队列效果。

    std::stack<int> stack_1;
    std::stack<int> stack_2;
    MyQueue() {
        
    }
    
    void push(int x) {
        stack_1.push(x);    
    }
    
    int pop() {
        //必须先把stack_2中清空,再将stack_1中的入栈,这样符合队列的逻辑
        if(stack_2.empty()){
            while(!stack_1.empty()){
                stack_2.push(stack_1.top());
                stack_1.pop();
            }
        }
        
        int result = stack_2.top();
        stack_2.pop();
        return result;
    }
    
    int peek() {
        //先调用pop弹出栈顶元素,然后将该元素再入栈
        int result = this->pop();
        stack_2.push(result); 
        return result;
    }
    
    bool empty() {
        return stack_1.empty() && stack_2.empty();
    }

225.用队列实现栈

//需理解两个队列无法像上题中的两个栈表示队列一样表示栈,因为先进后出在队列中不好实现,需用队列2来保存队列1中的前几个元素,队列1输出最后一个元素后再将队列2复制给队列1

    std::queue<int> queue_1;
    std::queue<int> queue_2;
    MyStack() {
        
    }
    
    void push(int x) {
        queue_1.push(x);
    }
    
    int pop() {
        int size = queue_1.size();
        size--;
        while(size--){
            queue_2.push(queue_1.front());
            queue_1.pop();
        }
        int result = queue_1.front();
        queue_1.pop();
        queue_1 = queue_2;
        while (!queue_2.empty()){
            // 注意清空que2
            queue_2.pop();
        }
        return result;
    }
    
    int top() {
        int size = queue_1.size();
        size--;
        while(size--){
            queue_2.push(queue_1.front());
            queue_1.pop();
        }
        int result = queue_1.front();
        queue_2.push(result);
        queue_1.pop();
        queue_1 = queue_2;
        while (!queue_2.empty()){
            // 注意清空que2
            queue_2.pop();
        }
        return result;
    }
    
    bool empty() {
        return queue_1.empty();
    }

20.有效的括号

//需理解栈在括号匹配时的作用 1中间的左括号和右括号不匹配即栈顶元素(表示左括号要匹配的右括号)和当前值不相同,2左括号没有匹配的右括号即formatter不为空,3右括号没有匹配的左括号即当前值时formatter为空

    bool isValid(string s) {
        std::stack<char> formatter;
        for(int i = 0; i < s.size(); i ++){
            if(s[i]=='('){
                formatter.push(')');
            }else if(s[i]=='{'){
                formatter.push('}');
            }else if(s[i]=='['){
                formatter.push(']');
            }else {
                
                if(formatter.empty() || formatter.top() != s[i]){
                    return false;
                }else{
                    formatter.pop();
                }
            }
        }
        
        return formatter.empty();
    }

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

//需理解如何用栈来解决匹配问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值