文章目录
- Leetcode 20. 有效的括号
- 题目详解
- 数据结构 双端队列(deque)
- Deque有三种用途:
- 思路
- 报错
- Ac代码
- Leetcode1047. 删除字符串中的所有相邻重复项
- 题目详解
- 数据结构 ArrayDeque类
- 思路
- AC代码
- 150. 逆波兰表达式求值
- 题目详解
- 报错
- 难点
- AC代码
- 收获
Leetcode 20. 有效的括号
题目详解
数据结构 双端队列(deque)
deque (double-ended
queue,双端队列)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
Deque有三种用途:
- 普通队列(一端进另一端出):
Queue queue = new LinkedList()或Deque deque = new LinkedList()
- 双端队列(两端都可进出)
Deque deque = new LinkedList()
- 堆栈
Deque deque = new LinkedList()
注意:Java堆栈Stack类已经过时,Java官方推荐使用Deque替代Stack使用。Deque堆栈操作方法:push()、pop()、peek()。引用自博主devnn
思路
分三种情况进行讨论
1 左括号多了
如果都判断完了字符串里的i都走了一遍,栈里还有东西 不为空 也
return false
2 匹配类型不一样
stack.peek() != a[i];
3 右括号多了 在消消乐时,发现字符串没消除完 栈空了
只需要判断栈stack 是否为空集就可以了
stack.isEmpty(); return false;
报错
关于java中的“error: bad operand types for binary operator
前后类型不一致 后来一看是因为 我在定义deque时 忘记将其 character了
Deque<Character> st= new LinkedList<>()
;
Ac代码
class Solution {
public boolean isValid(String s) {
//定义一个双端队列
Deque<Character> st= new LinkedList<>();
// 进行for循环 用ch传递s[i]
for(int i=0;i<s.length();i++)
{
char ch= s.charAt(i);
if(ch == '(')
{ st.push(')');}
else if( ch =='{')
{st.push('}');}
else if(ch == '[')
{st.push(']');}
//进行右边判断
else if
( st.isEmpty() || st.peek() != ch)
{
return false;
}
else
st.pop(); //如果相等的话
}
return st.isEmpty();
}
}
Leetcode1047. 删除字符串中的所有相邻重复项
题目详解
数据结构 ArrayDeque类
ArrayDeque类是 双端队列的线性实现类。
☞ ArrayDeque是采用数组方式实现的双端队列。
☞ ArrayDeque的出队入队是通过头尾指针循环,利用数组实现的。
☞ ArrayDeque容量不足时是会扩容的,每次扩容容量增加一倍。
☞ ArrayDeque可以直接作为栈使用。当用作栈时,性能优于Stack,当用于队列时,性能优于LinkedList。
————————————————
引用博主「妙乌」的文章
思路
与上一道题相似 都是消除类的题,这道题里的栈放的是已经遍历过的数据
AC代码
class Solution {
public String removeDuplicates(String s) {
ArrayDeque<Character> st =new ArrayDeque<>();
char ch;
for(int i=0;i<s.length();i++)
{
ch =s.charAt(i);
if( st.isEmpty()|| st.peek()!= ch)
{
st.push(ch);
}
else
{
st.pop();
}
}
String result ="";
while(! st.isEmpty())
{
result= st.pop()+result;
}
return result;
}
}
150. 逆波兰表达式求值
题目详解
后缀表达式 计算机只要按着顺序去处理这个字符串就可以 用的栈
报错
> java.lang.NumberFormatException: For input string: "/"
虽然报错的地方是下面 不过 根据报错信息来看 应该跟/有关仔细一看多了一个空格 导致报错了
难点
根据条件将符合条件的数据从栈中跳出来 很简单 ,稍微难点就是“-”
和“/” 那块有点特殊
else if( "-".equals(s))
{
stack.push(-stack.pop()+stack.pop());
}
/
else if("/".equals(s))
{
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push( temp2/temp1);
}
AC代码
class Solution {
public int evalRPN(String[] tokens) {
Deque <Integer> stack= new LinkedList<>();
for(String s:tokens)
{ // 注意 - 和/ 需要特殊处
if( "+".equals(s))
{
stack.push(stack.pop()+stack.pop());
}
else if("-".equals(s))
{
stack.push( - stack.pop()+stack.pop());
}
else if("*".equals(s))
{
stack.push(stack.pop()* stack.pop());
}
else if("/".equals(s))
{
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push( temp2/temp1);
}
else
{
stack.push( Integer.valueOf( s));
}
}
return stack.pop();
}
}
收获
今天开始使用Deque了 ,之前一直没接触过 双端队列 , 差不多可以了
我饿了
我去弄点吃的