【代码随想录| 栈与队列1】

 232.用栈实现队列

题目链接https://leetcode.cn/problems/implement-queue-using-stacks/

push的要求是把队列的往队列的栈顶添加元素,用栈来实现简直就是老天爷赏饭吃,直接push就完事了

class MyQueue {
public:
stack<int> sin;
stack<int> sout;
    MyQueue() {

    }
    
    void push(int x) {
        sin.push(x);
    }
    
    int pop() {
        
        if(sout.empty()){//题目给的数据没有空的这道题里面这个条件有没有没影响
            while(!sin.empty()){//只要sin还有元素就往sout里面push元素
                sout.push(sin.top());
                sin.pop();
            }
        }
           int res=sout.top();
           sout.pop();
        return res;
    }
    
    int peek() {
        int res=this->pop();
        sout.push(res);
        return res;//题目要求是只返回栈顶元素,pop会把栈顶去掉所以一定要记得把栈顶的元素加回去
    }
    
    bool empty() {
        return sin.empty()&&sout.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.用队列实现栈

题目链接https://leetcode.cn/problems/implement-stack-using-queues/description/

while(size--)和while(--size)两种循环while(size--)循环会执行size次,而while(--size)会执行size-1次,要看具体需求来用这两种循环。

class MyStack {
public:
queue<int> que;
    MyStack() {
        
    }
    
    void push(int x) {
        que.push(x);
    }
    
    int pop() {
        int size=que.size();
        size--;
        while(size--){//循环size次
            int top=que.front();//反复把队列第一个元素放最后
            que.pop();
            que.push(top);
        }
        int top=que.front();
        que.pop();//寻找的栈顶元素pop并返回
        return top;
    }
    
    int top() {
        return que.back();
    }
    
    bool empty() {
        return que.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.有效的括号

题目链接https://leetcode.cn/problems/valid-parentheses/description/

一共有三种情况

1、左括号多了

2、右括号多了

3、左右括号不匹配

class Solution {
public:
    bool isValid(string s) {
        stack<char> br;
        if(s.size()%2!=0){//剪枝,如果是奇数直接返回
            return 0;
        }
        for(int i=0;i<s.size();i++){
            if(s[i]=='[')br.push(']');
            else if(s[i]=='(')br.push(')');
            else if(s[i]=='{')br.push('}');
            else if(br.empty()||s[i]!=br.top())return 0;//右括号多了,和括号不匹配
            else br.pop();//else if(br.top()==s[i])br.pop();相等的时候消了
        }
       return br.empty();
    }
};

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

题目链接https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/

这道消消乐题简直精简得离谱

把字符串当栈来用如果和字符不相等就放后面,相等就把这个字符都弹出,最后直接返回字符串

字符串的循环是

class Solution {
public:
    string removeDuplicates(string s) {
        string res;
        for(char str:s){//遍历字符串里的每一项,用str代表(范围基的for循环)
            if(res.empty()||str!=res.back()){
                res.push_back(str);
            }
            else 
            res.pop_back();
        }
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值