leetcode 第三天 栈的简单实现和应用

完成题目:

  • LeetCode 20、有效的括号
  • LeetCode 155、最小栈
  • LeetCode 150、逆波兰表达式求值

先简单回顾一下栈的知识点:
1、先进后出(以下题目基本是运用了此特性)

2、基本操作如:pop():弹出最后一个置入的元素(没有返回值!!!)

                           push():入栈操作

                           top():访问栈顶元素

                            empty():判断栈是否为空

给出例题:

获取栈中最小的元素:

解法一:
使用一个辅助栈,普通栈正常压入、弹出,辅助栈在压入时须比较 辅助栈上置顶的值 与 压入数大小,并将小的压入,此时记录的就是此位置以下最小的值

解法二:

差值法:

压栈时:
1、一开始即栈为空时直接记min ,并压入 0;

2、当差值为负值时,先压入负值,再更新min值

出栈时:

>0,正常计算复原值,正常弹出

<0,top()取min值,弹出时需计算min值

附上代码:

class MinStack {
    stack<long> x_stack;
    long min;
public:
    MinStack() {
    return ;
    }
    
    void push(int val) {
        if(x_stack.empty())
        {
            min=val;
            x_stack.push(0);
        }
        else
        {
            long temp=val-min;
            x_stack.push(temp);
            if(temp<0)
            min=val;
        }
    }
    
    void pop() {

        if(x_stack.top()<0)
        {
            min-=x_stack.top();
        }
        x_stack.pop();
    }
    
    int top() {
        if(x_stack.top()<0)
        return min;
        else
        return x_stack.top()+min;
    }
    
    int getMin() {
        return min;
    }
};

LeetCode 20、有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

此题需结合哈希表写,因为每一对括号都是相匹配的

unordered_map<char,char> Hashmap
{{'(',')'},{'{','}'},{'[',']'},{'?','?'}};

为了使题更加好判断,选择加入“?”入栈,最后如果不是?结尾,必定不完全匹配

给出代码:

class Solution {
public:
    bool isValid(string s) 
    {
        //建立一个哈希表,进行匹配
        unordered_map<char,char> Hashmap
        {{'(',')'},{'{','}'},{'[',']'},{'?','?'}};
        stack<int> st;
        
        st.push('?');
        for(char c:s)
        {
            //不为0说明哈希表可以匹配 只有为前半括号时
            if(Hashmap[c] != 0 )
            st.push(c);

            //当后半括号出现时,必须是匹配最近也就是栈顶的括号
            else if(c==Hashmap[st.top()])
            st.pop();
            
           //其他情况必定不能匹配了
            else
            return false;
        }

        if(st.top()=='?')
        return true;
        else return false;
    }
};

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值