代码随想录DAY10|栈和队列理论基础 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

栈和队列理论基础

  1. C++中stack 是容器么?不是容器,是容器适配器。
  2. 我们使用的stack是属于哪个版本的STL?SGI STL。
  3. 我们使用的STL中stack是如何实现的?默认情况是deque(双向队列),也可以手动指定为vector或者list。
  4. stack 提供迭代器来遍历stack空间么?不提供。232.用栈实现队列

 232.用栈实现队列

 

1.为什么MyQueue()是空的?

2.可以用!表示非

3.不要写成this->push(result);

 225. 用队列实现栈

 

1. 栈和队列提供.size()方法

2.这一块代码不要忘了,获取top元素之后要把队列恢复原状

20. 有效的括号

我的代码:

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        for(int i=0; i < s.size(); i++){
            if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
                stk.push(s[i]);
            }
            else{
                if(s[i] == ')'){
                    if(!stk.empty() && stk.top() == '('){
                        stk.pop();
                    }
                    else{
                        return false;
                    }
                }
                if(s[i] == ']'){
                    if(!stk.empty() && stk.top() == '['){
                        stk.pop();
                    }
                    else{
                        return false;
                    }
                }
                if(s[i] == '}'){
                    if(!stk.empty() && stk.top() == '{'){
                        stk.pop();
                    }
                    else{
                        return false;
                    }
                }
            }
        }
        //栈不为空,也匹配失败
        if(stk.empty()){
            return true;
        }
        else{
            return false;
        }
    }
};

写的太冗余,优化一下:遇到左括号,不入栈左括号,而是入栈右括号,这样在出栈匹配的时候就可以用统一的相等语句判断,而不需要一一判断。

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        for(int i=0; i < s.size(); i++){
            if(s[i] == '('){
                stk.push(')');
            }
            else if(s[i] == '['){
                stk.push(']');
            }
            else if(s[i] == '{'){
                stk.push('}');
            }
            else{//是右括号
                if(!stk.empty() && stk.top() == s[i]){
                    stk.pop();
                }
                else{
                    return false;
                }
            }
        }
        //栈不为空,也匹配失败
        return stk.empty();
    }
};

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

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> stk;
        for(int i=0; i < s.size(); i++){
            if(stk.empty() || s[i] != stk.top()){
                stk.push(s[i]);
            }
            else{
                stk.pop();
            }
        }
        int size = stk.size();
        int i = size - 1;
        while(!stk.empty()){
            char topElem = stk.top();
            stk.pop();
            s[i--] = topElem;
        }
        s.resize(size);
        return s;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值