1.有效的括号
本题主要是栈的简单应用,java中可以用deque来模拟栈和队列,具体实现采用LinkedList。
-
接口实现:
LinkedList
类实现了Deque
接口,这意味着LinkedList
具有Deque
的所有功能。作为Deque
的实现,LinkedList
可以作为一个双端队列使用,即在两端进行插入和删除操作。 -
方法共性:由于
LinkedList
实现了Deque
接口,它继承了Deque
的所有方法。这包括在队列头部和尾部添加、删除和检索元素的方法。例如,addFirst
、addLast
、removeFirst
、removeLast
、peekFirst
和peekLast
等。 -
灵活性:
LinkedList
作为Deque
,可以灵活地用作栈(后进先出)或队列(先进先出)。它也可以简单地作为一个列表来使用,因为它实现了List
接口。
总之LinkedList
和Deque
的关系是实现和接口的关系。LinkedList
作为Deque
的一个具体实现,继承了Deque
的所有功能,并增加了基于链表的特性。在选择使用LinkedList
还是其他Deque
实现(如ArrayDeque
)时,应根据具体的应用场景和性能需求来决定。
后面是本题思路我们将所有的左括号的对应右括号入栈,然后再判断是否有一样的右括号进入如果有就把这个右括号给出栈,在所有循环过后才能
class Solution {
public boolean isValid(String s) {
Deque<Character> deque = new LinkedList<>();
char ch;
for(int i=0;i<s.length();i++){
ch=s.charAt(i);
if(ch=='('){
deque.push(')');
}else if (ch == '{') {
deque.push('}');
}else if (ch == '[') {
deque.push(']');
}else if(deque.isEmpty() || ch!=deque.peek()){
return false;
}else{//进入这个判断只能是 不是左括号并且deque不为空且peek==ch
deque.pop();
}
}
return deque.isEmpty();
}
}
1047. 删除字符串中的所有相邻重复项
ArrayDeque会比LinkedList在除了删除元素这一点外会快一点
参考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist
本题也是很简单的应用,就是注意charAt方法以及因为要顺序输出最后的结果所以要新String一个字符串每次把pop的内容加在前面。
class Solution {
public String removeDuplicates(String s) {
ArrayDeque <Character> deque=new ArrayDeque<>();
char ch;
for(int i=0;i<s.length();i++){
ch=s.charAt(i);
if(deque.isEmpty()||ch!=deque.peek()){
deque.push(ch);
}else{
deque.pop();
}
}
String str="";
while(!deque.isEmpty()){
str=deque.pop()+str;
}
return str;
}
}
150. 逆波兰表达式求值
值得注意的就是运算顺序就是除和减都是第二个pop的也就是先进栈的去除,减第一个pop也就是后进栈的,然后减就改成负的加不然你可能需要赋值毕竟第一个pop的是被减的对象,就像除法一样。然后就是push字符串形式的数字要用 Integer.valueOf(s)
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();
}
}