代码随想录算法训练营第十天 | 栈与队列part01| 232.用栈实现队列 、225. 用队列实现栈、 20. 有效的括号、1047. 删除字符串中的所有相邻重复项

232.用栈实现队列

栈与队列的基本知识:
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());
        }
}


 

225. 用队列实现栈

思路是用两个队列实现栈的先进后出,队列2用来临时存储

push方法中,把第一个队列元素取出,全部放到队列2里,然后新添加的元素放到队列1里,再把队列2的元素返回队列1,就实现了后进的先出,和栈的排列方式一样

其他方法直接执行就可以,顺序已经在push的时候摆好了

20. 有效的括号

判断括号的题用栈

括号不匹配分为三种情况:左括号比右括号多;右括号比左括号多;左右括号一样多但是对应不上

方法是让左括号一个一个入栈,再根据右括号匹配相应的左括号出栈,多了少了不对应了都false

更快的方法是遍历左括号,让对应的右括号入栈,左括号遍历完之后,所有相应的右括号就在栈里了。接下来遍历右括号的时候,只需要看右括号是不是和栈里的一一对应就行。具体是每遍历一个右括号,就弹出顶部的元素,如果遍历到的和顶部元素不对应,说明没对应上,就是false。


代码随想录算法训练营第十天 | 栈与队列part01| 232.用栈实现队列 、225. 用队列实现栈、 20. 有效的括号、1047. 删除字符串中的所有相邻重复项_第1张图片

错误的地方:


创建栈用Stack stack = new Stack<>();
下面元素添加到栈里写
stack.push(')');
    这样不对,因为Stack显然是存储整数类型,如果要存储字符,应该用Deque deque = new LinkedList<>();声明
或者Stack stack = new Stack<>();
    
还有我写 for(int i = 0; i < s.length() - 1; i++)
应该是 for(int i = 0; i < s.length(); i++)
注意不要习惯性记错了,以为要减一,实际上基本上都不需要减,因为减了遍历不到最后一个

1047. 删除字符串中的所有相邻重复项 

为什么用栈?

在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢?就是用栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下是不是遍历过相同数值的相邻元素。然后再去做对应的消除操作。 

知识点:


把栈转为字符串的写法

String str = "";
        while(!stack.isEmpty()){
            str = stack.pop() + str;
        }
return str;


 

你可能感兴趣的:(刷题,算法,java,开发语言)