目录
一、20. 有效的括号
现在Java中很少用Stack,而是采用Deque(双端队列)来实现栈
class Solution {
public boolean isValid(String s) {
Deque<Character>stack1=new LinkedList<>();
char ch;
for(int i=0;i<s.length();i++)
{
ch=s.charAt(i);
if(ch=='(')
{
stack1.push(')');
}
else if(ch=='[')
{
stack1.push(']');
}
else if(ch=='{')
{
stack1.push('}');
}
else if(stack1.isEmpty()||stack1.peek()!=ch)
{
return false;
}
else{
stack1.pop();
}
}
return stack1.isEmpty();
}
}
此时只能用push和pop来实现,add和offer是用来实现队列的。
void push(E e)
如果可以在不违反容量限制的情况下立即执行此操作, IllegalStateException
到此双端队列表示的堆栈(换句话说,在此双端队列的头部),如果当前没有可用空间则抛出IllegalStateException
。
此方法相当于addFirst(E) 。
其中
Deque<Character>stack1=new LinkedList<>();
可以换为
Stack<Character>stack1=new Stack<>();
二、1047. 删除字符串中的所有相邻重复项
class Solution {
public String removeDuplicates(String s) {
Deque<Character>stack1=new LinkedList<>();
char ch;
for(int i=0;i<s.length();i++)
{
ch=s.charAt(i);
if(stack1.isEmpty()||ch!=stack1.peek())
{
stack1.push(ch);
}
else{
stack1.pop();
}
}
String str="";
while(!stack1.isEmpty())
{
str=stack1.pop()+str;
}
return str;
}
}
比较简单,类似于消消乐。用栈来遍历存储,只要遇到相同的就弹出。
同时注意,最终的结果不能直接用toString()。
三、150. 逆波兰表达式求值
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();
}
}
// leetcode 内置jdk的问题,不能使用==判断字符串是否相等