剑指-09

解题思路:

  1. 栈的特性的入栈在最下面,出栈元素在最上面,因此是先入后出
  2. 队列的特性是FIFO,先入先出
  3. 因为给了两个栈,因此可以通过栈1入栈作为队列的入口,栈2作为队列的删除口。栈2为空的时候,将栈1的元素依次出栈并依次入栈到2,这样的话栈2最上面的元素就会是整个抽象队列最开始添加的元素。
  4. 当存入的时候统一存入栈1,当删除的时候去栈2删除,如果栈2为空,则去栈1寻找元素,如果栈1也为空,那么返回-1
class CQueue {

    // 添加栈
    int[] stack_1;
    int index_1;
    // 删除栈
    int[] stack_2;
    int index_2;

    public CQueue() {
        stack_1 = new int[10000];
        stack_2 = new int[10000];
        index_1 = 0;
        index_2 = 0;
    }
    
    public void appendTail(int value) {
        stack_1[index_1++] = value;
    }
    
    public int deleteHead() {
        if (index_1 == 0 && index_2 == 0) {
            return -1;
        }

        if (index_2 > 0 ) {
            int v =  stack_2[index_2];
            index_2 --;
            return v;
        } else {
            // 将入栈元素倒入出栈元素中
            for(int i = index_1; i >= 0;i --) {
                stack_2[index_1 - i] = stack_1[i];
            }
            index_2 = index_1;
            index_1 = 0;

            int v =  stack_2[index_2--];
            return v;
        }
    }
}

Q.E.D.


每一个平凡的日常都是连续的奇迹