天天看点

LeetCode 用栈实现队列(简单 232题)

算法思想:利用两个栈代替队列,数据依次进栈1,然后依次出栈1 进栈2,最后出栈2.得到的顺序和队列刚好是一样的。

LeetCode原题链接

class MyQueue {
    int[] stack1;
    int[] stack2;
    int top1=-1;
    int top2=-1;
    /** 通过无参构造初始化栈1和2. */
    public MyQueue() {
        stack1=new int[100];//由于题目要求push操作不超过100次,所以初始化栈100
        stack2=new int[100]; 
    }
    /** Push操作的时候,先进栈1,在push操作里,数据不进行栈1到栈2的转移*/
    public void push(int x) {
        stack1[++top1]=x;
        
    }
    /** pop操作获得队头元素,此时需要先判断栈2中是否有数据,如果有则弹出,如果没有,数据则进行栈1到栈2的转移 */
    public int pop() {
        if(top2>-1){
             return stack2[top2--];
        }
        while(top1>-1){
        stack2[++top2]=stack1[top1--];
        }
        return stack2[top2--];
    } 
    /** peek函数为查看队头元素,此操作和pop操作一样,唯一的区别的就是————查看元素不需要移动指针top2 */
    public int peek(){
        if(top2>-1){
             return stack2[top2];
        }
        while(top1>-1){
        stack2[++top2]=stack1[top1--];
        }
        return stack2[top2];
    }
    /** 此函数是判断自己创造的队列是否为空,因为是两个栈,所以要判断top1和top2 */
    public boolean empty() {
        if(top1==-1&&top2==-1){
            return true;
        }else{
            return false;
        }
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */