代码随想录算法训练营Day10 | Leetcode 232 用栈实现队列 Leetcode 225 用队列实现栈 Leetcode20有效的括号 Leetcode 1047 删除字符串所有相临重复项

前言

纪念第一次看到一道题有思路且自己写出来哈哈哈哈哈哈哈哈哈。

Leetcode 232 用栈实现队列

题目链接:232. 用栈实现队列 - 力扣(LeetCode)

代码随想录题解:代码随想录 (programmercarl.com)

思路:用栈实现队列和用队列实现栈本质上都是用另一个容器改变当前容器的顺序,例如栈是先进后出,那么再用另一个栈就变成了先进先出。

代码:

class MyQueue {
public:
    stack<int> in;
    stack<int> out;
    MyQueue() {

    }
    
    void push(int x) {//入队列
    in.push(x);
    }
    
    int pop() {//出队列
    if(out.empty())//如果出栈为空
    {
        while(!in.empty())//把入栈的元素全转移到出栈
        {
            out.push(in.top());
            in.pop();
        }
    }
    int result;
    result=out.top();//此时的栈顶就是队列的头
    out.pop();
    return result;
    }
    
    int peek() {
    int result=this->pop();
    out.push(result);
    return result;
    }
    
    bool empty() {
    return in.empty()&&out.empty();
    }
};

Leetcode 225 用队列实现栈

题目链接:225. 用队列实现栈 - 力扣(LeetCode)

代码随想录题解:代码随想录 (programmercarl.com)

思路:这个相比于用栈实现队列更简单一点,队列的尾就是栈的头,那在队列中模拟出栈的动作就是把队列尾前面的元素都重新加入到队列尾就行。

代码:

class MyStack {
public:
    queue<int> out;
    MyStack() {

    }
    
    void push(int x) {
    out.push(x);
    }
    
    int pop() {
    for(int i=0;i<out.size()-1;i++)//把对列尾前面的元素全移到队尾
    {
        int result=out.front();
        out.pop();
        out.push(result);
    }
    int result=out.front();
    out.pop();
    return result;
    }
    
    int top() {
    return out.back();
    }
    
    bool empty() {
    return out.empty();
    }
};

Leetcode 20 有效的括号

题目链接:20. 有效的括号 - 力扣(LeetCode)

代码随想录题解:代码随想录 (programmercarl.com)

思路:遍历字符串,用一个栈记录需要右括号的急切程度,如果是左括号就存入对应的右括号,如果是右括号就与栈顶对比,如果不能满足当前右括号的急切程度,也就是当前右括号不是所需的右括号,那么就不对,如果满足就出栈。遍历完字符串如果栈为空那么证明满足。

代码:

class Solution {
public:
    bool isValid(string s) {
    if(s.size()%2!=0)//如果不是偶数长度肯定不行
    {
        return false;
    }
    stack<char> st;
   for(int i=0;i<s.size();i++)
   {
    if(s[i]=='(')
    {
        st.push(')');
    }
    else if(s[i]=='[')
    {
        st.push(']');
    }
    else if(s[i]=='{')
    {
        st.push('}');
    }
    else if(st.empty()||st.top()!=s[i])//如果右括号不能满足急切程度 或者不需要右括号
    {
        return false;
    }
    else
    {
        st.pop();//出栈
    }
   }
    return st.empty();
   }
  
};

Leetcode 1047 删除字符串所有相临重复项

题目链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

代码随想录题解:代码随想录 (programmercarl.com)

思路:利用栈记录字符串,如果当前栈空那么就入栈,如果当前栈不为空就看此时的栈顶元素与当前遍历字符是否一样,如果一样就出栈,不一样就入栈。遍历完字符串后栈里的元素就是字符串的倒叙,出栈翻转一下就行。

代码:

class Solution {
public:
    string removeDuplicates(string s) {
    stack<char> st;
    for(int i=0;i<s.size();i++)
    {
        if(!st.empty())//如果栈不为空
        {
            if(st.top()==s[i])//栈顶元素和遍历元素是否相等
            {
                st.pop();//相等则出栈
            }
            else
            {
                st.push(s[i]);//不相等则入栈
            }
        }
        
        else 
        {
        st.push(s[i]);//栈空直接入栈
        }
    }
    string res;
    while(!st.empty())
    {
        res+=st.top();//翻转字符串
        st.pop();
    }
    reverse(res.begin(), res.end());
    return res;
    }
};

总结

今天家中聚餐比较累所以就不总结C++知识点了,但第一次能看到题目有思路自己写出来还是比较值得纪念的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值