有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

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

示例 3:

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

解题思路

  刚开始看到这道题的时候,我没什么思路(可能是太久没学java,把一些基础知识都忘了)后面看到提示说可以使用栈的知识去解决,就赶紧又去看看栈

栈和队列

栈和队列是两种重要的线性结构,都是操作受限的线性表

栈:

只允许在一端进行插入和删除的线性表,特点:后进先出(Last In First Out ,LIFO)

  常见操作::

  1、push() 将一个元素添加到栈的顶部

  2、pop() 从栈的顶部移除一个元素,并返回

  3、peek() 返回栈顶元素

  4、isEmpty() 判断栈是否为空,若为空,返回true,否则 返回false;

如何创建一个栈::

  1、使用数组来模拟栈:

  2、使用链表来模拟栈:

     LinkedList<类型> 栈名 =new LinkedList<>();

  3、Java中提供了一个封装好的栈类,即 java.util.Stack 类。使用这个类,可以更方便地实现栈的操作。

     Stack<类型> 栈名= new Stack<>();

队列:

   允许在一端进行插入,在另一端进行删除的线性表,特点:先进先出(Fist In First Out,FIFO)

   只允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front)

LinkedList

链表实现的线性表(双链表)。是 Java 集合中比较常用的数据结构,与 ArrayList 一样,实现了 List 接口,只不过 ArrayList 是基于数组实现的,遍历时很快,但是插入、删除时都需要移动后面的元素,效率略差些。而 LinkedList 是基于链表实现的,插入、删除时只需要改变前后两个节点指针指向即可。所以 LinkedList 插入和删除方面要优于 ArrayList,而随机访问上ArrayList 性能更好

除了 List 接口之外,LinkedList 还实现了 Deque(实现队列、可以实现栈),Cloneable,Serializable 三个接口。这说明该数据结构支持队列,克隆和序列化操作的。与 ArrayList 一样,允许 null 元素的存在,且是不支持多线程的。

ArrayList和LinkedList区别:

1、ArrayList是基于动态数组的数据结构、LinkedList是基于链表实现

2、对于随机访问的get和set方法,ArrayList有优于LInkedList,因为LInkedList要移动指针

3、对于新增和删除操作,LinkedList比较占优势,因为ArrayList要移动数据

应用场景:

ArrayList使用在查询比较多场景,而LinkedList适用于插入删除比较多场景

原文链接:https://blog.csdn.net/qq_49129184/article/details/122869024

题解:

该题的目的是对字符串进行匹配,所以我们可以使用栈来解决。首先我们发现要成功匹配,那么该字符串必须是偶数,所以刚开始我们可以进行奇偶数的判定,如果s.length()%2!=0,则return false;

然后我们发现这些符号是一一匹配的关系(){}[],所以联想到了哈希表的相关概念,我们可以创建一个哈希表用来实现一一对应。这里我们需要将右括号作为key值,左括号为value值(因为后面我们要进行匹配)

创建一个栈,循环遍历字符串,如果该字符是左括号(‘(','{','['),则将其压入栈中,如果是右括号,进行如下判断:若此时栈为空,或者该右括号在哈希表中对应的value值不等于栈顶元素,则return true;否则说明此时左右括号是匹配的,将该左括号从栈顶取出;循环遍历完字符串后,若1栈为空说明所有括号成功匹配 return true

int n=s.length();
if (n%2!=0)    //进行长度为偶数的判断
   return false;

//创建哈希表
HashMap<Character> hash=new HashMap<>();
hash.put(')','(');
hash.put('}','{');
hash.put(']','[');

//创建空栈
LinkedList <Character> stack=new LinkedList<>();

//循环遍历字符串
for(int i=0;i<n;i++)
{
   char c=S.charAt(i);// 获取当前字符
   if(c=='(' || c='{' ||c='[') //若当前字符为左括号,则入栈
      stack.push(c);
   if(c==')' || c='}' ||c=']')  //若当前字符是右括号,进行判断
   {   if(stack.isEmpty() ||stack.get(c)!=stack.peek())  
            return false;
       else
            stack.pop();
  }
}

return stack.isEmpty();//最后,栈为空则返回true;

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值