算法训练Day11||232.用栈实现队列|225.用队列实现栈| 20.有效括号

232.用栈实现队列

思路:用两个栈实现一个队列操作

入队操作:将数据直接压入其中一个栈中

出队操作:将其中一个栈中的元素压入另一个栈中,再将元素从另一个栈中弹出,这样就是实现了先进先出的操作。

获取队首元素:与出队操作大致相同,将一个栈中元素压入另一个栈中,然后通过stack.top()获取其中的元素

细节部分:

入队操作不是连续的,而是入队和出队操作间断进行的,那么出队操作就要进行一些逻辑判断操作,如果第二个栈不为空,就将第二个栈中的元素直接弹出,如果第二个栈为空,就将第一个栈中的所有元素压入第一个栈中。

获取队首元素也可以直接调用第二个出队函数,然后输出弹出的值,再将弹出的值压回栈顶

代码部分:

class MyQueue {
public:
//创建两个栈,压栈的时候压入其中一个栈之中,弹栈的时候,将一个栈中的元素弹到另一个栈中完成后,再从另一个栈中
//弹出来
    MyQueue() {
       // stack<int> q1,q2;
    }
    
    void push(int x) {
        q1.push(x);
    }
    
    int pop() {
        if(q2.empty())//如果q2是真的
        //一定要保持先进先出的原则,所以要将q2中的元素弹出完全后才将q1中的元素导入q2.
        while(q1.empty()==false){
            q2.push(q1.top());
            q1.pop();
        }
        int result=q2.top();
        q2.pop();
        return result;
    }
    
    int peek() {
        int result=this->pop();
        q2.push(result);
        return result;
    }
    
    bool empty() {
        if(q1.empty()&&q2.empty()){
            return true;
        }
        return false;
    }
    private:
    stack<int>q1,q2;
};

225.用队列实现栈

思路:用一个队列实现栈的操作

入栈操作:就将元素正常压入队列中。

出栈操作:先将最后一个入队元素之前的元素(n-1个元素)全部弹出,并加入队列的尾部,然后进行弹出操作。

获取栈顶元素:与出栈大致相同,也是将队中最后一个元素之前的元素进行弹出后再进行入队,然后front()函数进行获取栈顶元素

代码展示:

class MyStack {
public:
//用队列实现栈,
    MyStack() {
        
    }
    
    void push(int x) {
        que.push_back(x);
    }
    
    int pop() {
        //将最后一个元素的前面元素全部弹出
        int size=que.size();
        size--;
        while(size--){
            //将前面弹出的元素加到最后的位置
            que.push_back(que.front());
            que.pop_front();
        }
        int result=que.front();
        que.pop_front();
        return result;
    }
    
    int top() {
        return que.back();
    }
    
    bool empty() {
        return que.empty();
    }
    private:
    deque<int> que;
};

/**
 * 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.左边括号多了的情况    2.左右括号相等但是出现了括号类型匹配错误的问题         3.右边括号多出的情况

解决方法:遇到左括号就进行压栈操作,遇到右括号时,就匹配栈顶元素,如果匹配就进行弹栈操作。

用栈的数据结构模拟出这三种情况的发生,1.当出现第一种情况时,当字符串中括号遍历完成后,栈中仍然没空。 2.第二种情况发生当栈顶元素与字符串遍历到的元素不配对。 3.字符串遍历到右括号时栈中为空。

代码部分:

class Solution {
public:
    bool isValid(string s) {
        stack<int> my_stack;
        for(int i=0;i<s.size();i++){
            //遍历字符串
            //这里为什么如果是左括号会压入对应的右括号,因为
            //因为当遇到右括号时能够方便判断
            if(s[i]=='('){
                my_stack.push(')');
            }else if(s[i]=='['){
                my_stack.push(']');
            }else if(s[i]=='{'){
                my_stack.push('}');
            }else if(my_stack.empty()||s[i]!=my_stack.top()){    
                return false;
            }else{
                my_stack.pop();
            }
        }
        return my_stack.empty();
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值