关于栈队列

44 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18 天,点击查看活动详情

我们都知道栈是先入后出,队列是先入先出,那么能不能用栈实现队列?该用什么数据结果实现栈?

用两个栈,实现队列

基础:栈只允许在表尾(栈顶)进行插入和删除。队列是在表尾(队尾)进行插入,表头进行删除。

他们两个都是操作搜现在的线性表。

首先,了解一下思路

假设我们加入数据顺序是 1 2 3 4 5,如果是队列,弹出顺序应该是:1 2 3 4 5.如果是栈,弹出顺序应该是5 4 3 2 1。那么我们把5 4 3 2 1按照顺序放入另外一个栈,那么另外一个栈弹出顺序 1 2 3 4 5.

image.png

image.png

那么代码如何书写呢?

先对栈1进行push操作,当所有元素都加入后,对他进行出栈,并且报错出栈元素,把这个元素加入栈2.最好对栈2进行弹出。因为模拟的队列,所以只有两个方法,一个加入,一个删除。

怎么把第一个栈内容取出,放入第二个栈?stack2.push(stack1.pop())

第一个栈取出的最后一个元素,就是第二个栈的栈底,也就是队列的头部,自己弹出。

声明栈:Stack<Integer> stack=new Stack<Integer>

加入队列:

public int push(int node){
   stack1.push(node);
}

删除队列

public int pop(){
   while(!stack1.isEmpty()){
       stack2.push(stack1.pop());
   }
   int res=stack2.pop();
   while(!stack2.isEmpty){
       stack1.push(stack2.pop);
   }
   return res;
}

因为栈是操作受限制的线性表,线性表实现是数组,那么栈实现也是数组,所以可以通过动态数组实现堆栈结构

首先,声明一个list集合,push就是直接往list集合里面添加数。出栈,就是list集合的remove(int i)。

在这里,我们需要县第一栈的接口,接口里面有xx方法。然后新建一个类,实现这个接口,并且实现接口里面方法

  @Override
  public void push(E e) {
   array.addLast(e);
 }
 
  @Override
  public E pop() {
  return array.removeLast();
  }

  @Override
  public E peek() {
  return array.getLast();
  }


和栈相关的:包含min函数的栈

其实就是在栈里面新加一个min方法

  • 使用栈1记录进入栈的元素,正常进行push、pop、top操作。
  • 使用栈2记录每次push时候进入的最小值。
  • 每次push元素的时候与第二个栈的栈顶元素比较,若是较小,则进入第二个栈,若是较大,则第二个栈的栈顶元素再次入栈,因为即便加了一个元素,它依然是最小值。于是,每次访问最小值即访问第二个栈的栈顶。

关键是怎么写push

先正常往stack1添加数据,如果这个时候stack2是空,或者stack2的栈顶元素比加入值大,那么就需要跟新最小值,加入stack2.否则最小值不变,复制入栈

public void push(int node) {
        stack1.push(node);
        if(stack2.isEmpty()||stack2.peek()>node){
            stack2.push(node);
        }else{
            stack2.push(stack2.peek());
        }
    }