蒙飘 发表于 2025-6-7 10:17:41

算法day09-栈与队列(1)

目录


[*]力扣232. 用栈实现队列
[*]力扣225. 用队列实现栈
[*]力扣20. 有效的括号
[*]力扣1047. 删除字符串中的所有相邻重复项
 一、用栈实现队列

  主要思路:我们使用两个栈来实现一个队列的功能:其中一个作为输入栈,用于接收通过 push 操作传入的数据;另一个作为输出栈,专门用于处理 pop 和 peek 操作。当需要执行 pop 或 peek 时,如果输出栈为空,我们就将输入栈中的所有元素依次弹出,并按顺序压入输出栈。这样一来,输出栈的栈顶元素就对应了队列的队首,实现了先进先出的队列行为。
class MyQueue {
    Deque<Integer> inStack;
    Deque<Integer> outStack;

    public MyQueue() {
      //初始化两个栈
      inStack = new ArrayDeque<Integer>();
      outStack = new ArrayDeque<Integer>();
    }
   
    public void push(int x) {
      inStack.push(x);      
    }
   
    public int pop() {
      if(outStack.isEmpty()){         //当辅助栈里面镁元素时,要把入栈的元素倒压进出栈
            in2out();
      }
      return outStack.pop();
    }
   
    public int peek() {
      if(outStack.isEmpty()){
            in2out();
      }
      return outStack.peek();
    }
   
    public boolean empty() {
      return inStack.isEmpty() && outStack.isEmpty();
    }

    public void in2out(){
      while(!inStack.isEmpty()){
            outStack.push(inStack.pop());       //把入栈的元素压进出栈
      }
    }
}
//时间复杂度:O(1)
//空间复杂度:O(N)二、用队列实现栈

  主要思路:这里可以用两个队列来实现一个栈。首先我们定义两个队列,一个用作辅助。当我们push一个元素时,先将元素放到队列2中,然后将队列 1的所有元素出队加到队列2的末尾,然后再将队列2的所有元素出队放到队列1中。这样可以确保每次入栈操作都确保队列1的前端为栈顶元素,出栈和获得栈顶元素操作都可以简单实现。
class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;
    public MyStack() {
      queue1 = new LinkedList<Integer>();
      queue2 = new LinkedList<Integer>();
    }
   
    public void push(int x) {
      queue2.offer(x);
      while(!queue1.isEmpty()){
            queue2.offer(queue1.poll());
      }

      //交换queue1和queue2的元素
      Queue<Integer> temp = queue1;
      queue1 = queue2;
      queue2 = temp;
    }
   
    public int pop() {
      return queue1.poll();
    }
   
    public int top() {
      return queue1.peek();
    }
   
    public boolean empty() {
      return queue1.isEmpty();
    }
}
//时间复杂度:O(n)入栈,O(1):出栈、查看队首元素、判断为空
//空间复杂度:O(N)  方法二:用一个队列也可以实现栈。只需要修改:在每次入栈的时候,先统计此时队列的长度,然后将元素加入到队列的尾部,然后把本来有的几个元素都从对头弹出并从队尾压入,这样就能保持每次push 的元素都在最开头。
class MyStack {
    Queue<Integer> queue;

    public MyStack() {
      queue = new LinkedList<Integer>();
    }
   
    public void push(int x) {
      int n = queue.size();
      queue.offer(x);
      for (int i = 0; i < n; i++) {
            queue.offer(queue.poll());
      }
    }
   
    public int pop() {
      return queue.poll();
    }
   
    public int top() {
      return queue.peek();
    }

    public boolean empty() {
      return queue.isEmpty();
    }
}三、有效的括号


   主要思路:首先用一个哈希表记录右-左括号匹配对,然后去遍历输入的字符串,当前字符若是左括号则直接压入栈,若是右括号则进行判断:若栈为空,或者这个右括号与此时栈顶元素不匹配,则说明此字符串不是有效括号字符串。否则弹出字符。
class Solution {    public boolean isValid(String s) {      int n = s.length();      if( n % 2 == 1 ){       //如果长度为奇数,则一定不能匹配            return false;      }      Map map = new HashMap();      map.put(')', '(');      map.put(']', '[');      map.put('}', '{');      Deque stack = new ArrayDeque();      for(int i=0; i
页: [1]
查看完整版本: 算法day09-栈与队列(1)