栈练习--------有效的括号(LeetCode 20)

题目:点这里

解法

cpp 复制代码
class Solution {
public:
    bool isLeft(char a){
        if(a=='('||a=='{'||a=='['){
            return true;
        }else{
            return false;
        }
    }
    bool isMatch(char a,char b){
        if(a=='['&&b==']'||a=='{'&&b=='}'||a=='('&&b==')'){
            return true;
        }else{
            return false;
        }
    }
    bool isValid(string s) {
        int size = s.size();
        stack<char> st;
        for(int i=0;i<size;i++){
            if(isLeft(s[i])){//左括号
                st.push(s[i]);
            }
            else{//右括号
                if(st.empty()){//为空则匹配失败
                    return false;
                }
                if(!isMatch(st.top(),s[i])){//匹配失败则返回false
                return false;
                }
            st.pop();
            }
            
        }
        if(st.empty()){
            return true;
        }else{
            return false;
        }
    }
};

这个题目给我带来了栈的初步运用,因为我做之前那些题目一直觉得栈的存在感很低,跟链表和顺序表差不多,区分不开,现在这个题目恰恰体现了栈的作用,它不是一种底层的结构,它是一种思想。

这个题目也叫做括号消消乐,我们的栈巧妙地解决这个问题,保证相同括号两两匹配,而且保证顺序正确。

思路就是首先定义两个函数,一个负责判断左括号,一个负责匹配左括号和右括号,在题目给定的函数中,首先判断是否是左括号,利用函数1,是则输入到我们定义的栈里面去,然后如果不是左括号,那就是右括号,在else 语句中,咱们首先if 语句判断栈是否为空,如果是,那就简单了,没有与之匹配的左括号,直接返回false就好了,然后再用另一个if语句判断栈顶的左括号是否能够和这个右括号匹配,如果可以则弹出栈顶元素,这样的话,利用for循环,等待遍历结束,如果栈为空,则所有括号都两两配对成功,返回true,否则存在未配对的左括号,返回false.

这个栈利用地精妙绝伦,精妙之处在于,它可以完美地完成括号的消消乐,我举个例子,

{}() , ({}) , {(}),这三个里面,传入一个元素后紧接着就可以和右括号匹配,第二个传入两个,随着弹栈,依然可以一一匹配,第三个恰好不行,妙哉。

相关推荐
张小姐的猫8 分钟前
【Linux】多线程 —— 线程互斥
linux·运维·服务器·c++
AI算法沐枫14 分钟前
深度学习python代码处理科研测序数据
数据结构·人工智能·python·深度学习·决策树·机器学习·线性回归
m0_629494732 小时前
LeetCode 热题 100-----26.环形链表 II
数据结构·算法·leetcode·链表
壹号用户2 小时前
用队列实现栈
数据结构·算法
做人求其滴2 小时前
面试经典 150 题 380 274
c++·算法·面试·职场和发展·力扣
见叶之秋2 小时前
C++基础入门指南
开发语言·c++
计算机安禾2 小时前
【c++面向对象编程】第42篇:模板特化与偏特化:为特定类型定制实现
开发语言·c++·算法
玖釉-3 小时前
C++ 中的循环语句详解:while、do...while、for、嵌套循环与循环控制
开发语言·c++·算法
欧米欧4 小时前
C++进阶数据结构之搜索二叉树
开发语言·数据结构·c++
青小莫4 小时前
C++之vector讲解
c++·stl