给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 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;