每日一题-day11-11. 用两个栈实现一个队列-Java实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jun8148/article/details/85265533

11. 用两个栈实现一个队列

问题描述:

用两个栈实现一个队列。队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能。其中队列的声明如下,请自行补充appendTail()deleteHead()函数

public class Queue<T> {
    private Stack<T> stack1 = new Stack<T>();
    private Stack<T> stack2 = new Stack<T>();
    public void appendTail(T data) {
    	stack1.push(data);
    }
    public T deleteHead() {
        // ..... 
    }
}

分析:

  1. 队列是先进先出
  2. 栈是先进后出
  3. 我们需要拿两个先进后出的栈,来实现一个先进先出的队列。
  4. 我们假设要插入一个元素a,假设我们把a插入到stack1中,此时stack = {a}, stack2 = null,
  5. 我们继续插入元素 b、c ,还是插入到 stack1, 此时stack = {a, b, c}, stack2 = null}
  6. 假设我们现在需要删除一个元素,按照队列的特性 我们需要删除的是 a 这个元素,如果我们直接操作 stack1 这个栈,是无法做到的,那该怎么办呢?
  7. 此时我们就可以借助 stack2 来实现了,我们将 stack1 中的所有元素,全部移入到 stack2中,此时 stack1 = null, stack={c,b,a} stack2中的序列不就是我们的队列的序吗?我们从stack中取数据就好了
  8. 之后,如果我们需要appen的话,就直接append到stack1中,我们需要delete的话,直接从stack2 中取就行了,当stack2为空的话,就将stack1中的数据移入到stack2中,当stack1 为空的话,没有数据移入到stack2 的话就,移入空,当stack1 = stack2 = null 的时候,就说明 队列为空了。

代码如下:

import java.util.Stack;

/**
 * Class day11 ...
 *
 * @author LiJun
 * Created on 2018/12/26
 */


public class Queue<T> {
    private Stack<T> stack1 = new Stack<T>();
    private Stack<T> stack2 = new Stack<T>();

    public void appendTail(T data) {
        stack1.push(data);
    }


    public T deleteHead() {
        if (stack2.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.pop());
            }
        }
        if (stack2.empty()) {
            return null;
        }
        return stack2.pop();
    }

    @Override
    public String toString() {
        return "\nQueue{" +
                "stack1=" + stack1 +
                ", stack2=" + stack2 +
                '}';
    }


    public static void main(String[] args) {
        Queue<Integer> queue = new Queue<>();
       	// 依次向队列插入 1 2 3 4 数据 并打印当前队列信息
        queue.appendTail(1);
        queue.appendTail(2);
        queue.appendTail(3);
        queue.appendTail(4);
        System.out.print(queue);
        // 移出并打印队列两个元素 打印队列
        System.out.print(queue.deleteHead() + " ");
        System.out.print(queue.deleteHead() + " ");
        System.out.print(queue);
        // 向队列append 元素 5 6  并打印队列
        queue.appendTail(5);
        queue.appendTail(6);
        System.out.print(queue);
        // 移除队列
        System.out.print(queue.deleteHead() + " ");
        System.out.print(queue.deleteHead() + " ");
        System.out.print(queue.deleteHead() + " ");
        System.out.print(queue.deleteHead() + " ");
        System.out.println(queue);
        System.out.print(queue.deleteHead() + " ");
        System.out.print(queue.deleteHead() + " ");
        System.out.print(queue);
        System.out.print(queue);	
    }
}
// 为了方便查看,我就重写了toString函数

猜你喜欢

转载自blog.csdn.net/jun8148/article/details/85265533