Stack stack = new Stack<>();
stack.push(1)
stack.push(2)
stack.pop()
stack.size()
stack.peek() //获取栈顶元素
stack.isEmpty()
Queue q = new LinkedList<>();
q.offer(1)
q.offer(2)
q.poll() //从队头出队列
q.size()
q.peek() //获取队头元素
q.isEmpty()
定义一个方法,用两个栈模拟队列,队列是先进先出,所以把一个栈的元素一个一个出栈,全部添加到另外一个栈里,堆放顺序就和队列一样了。
push操作和入栈一样;pop操作要执行上面定义的方法,return stachOut的pop操作就行;peek操作要执行上面定义的方法,return stachOut的peek操作就行;empty操作检查stackIn和stackOut是否都为空就行。
while(!satckIn.isEmpty()){
stachIn.pop();
stackOut.push(stackIn.pop();)
}
stachIn.pop();多余了, stackOut.push(stackIn.pop();)中已经执行一次弹出了
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
布尔判断,这样写就可以了,表示如果后面成立就返回true
我写的是
public boolean empty() {
if(stackIn.isEmpty() && stackOut.isEmpty()){
return true;
}
}
这样缺少一个返回值,至少应该这样写
public boolean empty() {
if(stackIn.isEmpty() && stackOut.isEmpty()){
return true;
}
return false;
}
下面这个方法中,if (!stackOut.isEmpty()) return; 不能少,如果stackOut不是空的,就应该返回,不执行了。这样会影响顺序。
private void dumpStackIn(){
if (!stackOut.isEmpty()) return;
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
思路是用两个队列实现栈的先进后出,队列2用来临时存储
push方法中,把第一个队列元素取出,全部放到队列2里,然后新添加的元素放到队列1里,再把队列2的元素返回队列1,就实现了后进的先出,和栈的排列方式一样
其他方法直接执行就可以,顺序已经在push的时候摆好了
判断括号的题用栈
括号不匹配分为三种情况:左括号比右括号多;右括号比左括号多;左右括号一样多但是对应不上
方法是让左括号一个一个入栈,再根据右括号匹配相应的左括号出栈,多了少了不对应了都false
更快的方法是遍历左括号,让对应的右括号入栈,左括号遍历完之后,所有相应的右括号就在栈里了。接下来遍历右括号的时候,只需要看右括号是不是和栈里的一一对应就行。具体是每遍历一个右括号,就弹出顶部的元素,如果遍历到的和顶部元素不对应,说明没对应上,就是false。
创建栈用Stack
下面元素添加到栈里写
stack.push(')');
这样不对,因为Stack
或者Stack
还有我写 for(int i = 0; i < s.length() - 1; i++)
应该是 for(int i = 0; i < s.length(); i++)
注意不要习惯性记错了,以为要减一,实际上基本上都不需要减,因为减了遍历不到最后一个
为什么用栈?
在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢?就是用栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下是不是遍历过相同数值的相邻元素。然后再去做对应的消除操作。
把栈转为字符串的写法
String str = "";
while(!stack.isEmpty()){
str = stack.pop() + str;
}
return str;