题解 | #【模板】队列#

【模板】队列

http://www.nowcoder.com/practice/afe812c80ad946f4b292a26dd13ba549

import java.util.*;
/*
6
push 1
pop
front
push 2
push 3
pop

1
error
3
*/
public class Main {
    static Scanner sc = new Scanner(System.in);
    
    // 链表实现
    static void solve02() {
        int n = sc.nextInt();
        sc.nextLine();
        LinkedQueue queue = new LinkedQueue();
        while (n-- > 0) {
            String arr[] = sc.nextLine().split(" ");
            if (arr[0].equals("push")) {
                queue.push(Integer.parseInt(arr[1]));
            } else if (arr[0].equals("pop")) {
                Integer pop = (Integer) queue.pop();
                if (pop == null) {
                    System.out.println("error");
                } else {
                    System.out.println(pop);
                }
            } else if (arr[0].equals("front")) {
                Integer top = (Integer) queue.front();
                if (top == null) {
                    System.out.println("error");
                } else {
                    System.out.println(top);
                }
            }
        }
    }

    // 链表实现
    static void solve03() {
        int n = sc.nextInt();
        sc.nextLine();
        DoubleStackQueue queue = new DoubleStackQueue();
        while (n-- > 0) {
            String arr[] = sc.nextLine().split(" ");
            if (arr[0].equals("push")) {
                queue.push(Integer.parseInt(arr[1]));
            } else if (arr[0].equals("pop")) {
                Integer pop = (Integer) queue.pop();
                if (pop == null) {
                    System.out.println("error");
                } else {
                    System.out.println(pop);
                }
            } else if (arr[0].equals("front")) {
                Integer top = (Integer) queue.front();
                if (top == null) {
                    System.out.println("error");
                } else {
                    System.out.println(top);
                }
            }
        }
    }
    
    // 数组实现
    static void solve() {
        int n = sc.nextInt();
        sc.nextLine();
        Queue queue = new Queue(n);
        while (n-- > 0) {
            String arr[] = sc.nextLine().split(" ");
            if (arr[0].equals("push")) {
                queue.push(Integer.parseInt(arr[1]));
            } else if (arr[0].equals("pop")) {
                Integer pop = queue.pop();
                if (pop == -1) {
                    System.out.println("error");
                } else {
                    System.out.println(pop);
                }
            } else if (arr[0].equals("front")) {
                Integer top = queue.front();
                if (top == -1) {
                    System.out.println("error");
                } else {
                    System.out.println(top);
                }
            }
        }
    }
    
    
    public static void main(String[] args) {
//         solve();
//         solve02();
        solve03();
    }
    
    
}

///////////////////////////////////////
/*
10
front
pop
push 7
front
pop
pop
front
front
push 1
pop

error
error
7
7
error
error
error
1

*/
/**
 * 两个栈实现一个队列
 */
class DoubleStackQueue {
    Stack stackA;
    Stack stackB;

    public DoubleStackQueue() {
        stackA = new Stack();
        stackB = new Stack();
    }

    /**
     * 入队
     * @param data 数据
     */
    public void push(Object data) {
        stackA.push(data);
    }

    /**
     * 出队, 我们把 A里面的元素遍历拿出放入到B 中, 再拿出B中的第一个元素
     * @return 返回 队头的值
     */
    public Object pop() {
        // 判断 b 栈有没有元素, 有 返回 false, 无 返回 true
        if (stackB.isEmpty()) {
            while (!stackA.isEmpty()) {
                stackB.push(stackA.pop());
            }
        }
        return stackB.pop();
    }

    public Object front() {
        if (stackB.isEmpty()) {
            while (!stackA.isEmpty()) {
                stackB.push(stackA.pop());
            }
        }
       return stackB.isEmpty() ? null : stackB.top();
    }
}

class Stack {
    /**
     * 头节点, 无数据
     */
    private LNode head;

    public Stack() {
        head = new LNode();
        head.next = null;
        head.data = null;
    }

    public boolean isEmpty() {
        return head.next == null;
    }

    /**
     * 入栈
     * @param data
     */
    public void push(Object data) {
        // 创建新节点存储数据
        LNode tlNode = new LNode(data);
        // 头插法
        tlNode.next = head.next;
        head.next = tlNode;
    }

    /**
     * 出栈, 返回值
     * @return
     */
    public Object pop() {
        if (isEmpty()) return null;
        LNode del = head.next;
        // 让 head的 next 指向它的 下下个的值
        head.next = del.next;
        return del.data;
    }

    /**
     * 获取栈顶的值
     * @return
     */
    public Object top() {
        return isEmpty() ? null : head.next.data;
    }
}

class LNode {
    Object data;
    LNode next;

    public LNode() {
    }

    public LNode(Object data) {
        this.data = data;
    }

    public LNode(Object data, LNode next) {
        this.data = data;
        this.next = next;
    }
}
///////////////////////////////////////


///////////////////////////////////////

/**
 * 链表实现队列
 */
class LinkedQueue {
    // 设置两个结点node,front指向队首元素,rear指向队尾;
    /**
     * 队头指针, 指向队头节点
     */
    Node front;

    /**
     * 队尾指针, 指向队尾节点
     */
    Node rear;

    /**
     * 记录队列长度
     */
    int size = 0;

    public LinkedQueue() {
        front = rear = null;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 入队
     * @param ele
     * @return
     */
    public boolean push(Object ele) {
        if (size == 0) {
            front = new Node(null, ele);
            rear = front;
            size++;
            return true;
        }
        Node s = new Node(null, ele);
        //这块有个注意的地方,一旦rear设置了next属性,因为front节点与rear节点指向了同一个node节点,持有同一个结点的一个引用,因此front节点next属性也被填充
        rear.next = s;
        rear = s;
        size++;
        return true;
    }

    /**
     * 删除元素, 出队
     *
     * @return
     */
    public Object pop() {
        if (isEmpty()) return null;
        Object ele = front.element;
        front = front.next;
        if (size == 1) rear = front;
        size--;
        return ele;
    }

    /**
     * 队头
     * @return
     */
    public Object front() {
        return isEmpty() ? null : front.element;
    }


}

/**
 * 首先链表底层是一个个节点
 */
class Node {
    Node next;
    Object element;

    public Node(Node next, Object element) {
        this.next = next;
        this.element = element;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public Object getElement() {
        return element;
    }

    public void setElement(Object element) {
        this.element = element;
    }
}

///////////////////////////////////////

///////////////////////////////////////
/**
 * 队列的实现类 -- 数组
 */
class Queue {
    /**
     * 队列需要维护的数组
     */
    private int arr[];

    /**
     * 出队列的游标, 队头
     */
    private int front = 0;

    /**
     * 入队列的游标, 队尾
     */
    private int rear = 0;

    public Queue(int size) {
        arr = new int[size];
    }

    /**
     * 插入数据
     * @param value
     */
    public void push(int value) {
        if (rear - front == arr.length) {
            // 队列满了,即将新建一个数组...
            int brr[] = new int[arr.length * 2];
            for (int i = front; i < rear; i++) {
                brr[i] = arr[i % arr.length];
                arr = brr;
            }
        }
        // 循环完回到初始位置
        arr[rear % arr.length] = value;
        rear++;
    }

    /**
     * 输出数据
     * @return
     */
    public int pop() {
        // 队列空了
        if (rear == front) {
            return -1;
        }
        int value = arr[front % arr.length];
        front++;
        return value;
    }

    public int front() {
        // 队列空了
        if (rear == front) {
            return -1;
        }
        return arr[front];
    }

}
///////////////////////////////////////
全部评论

相关推荐

手撕没做出来是不是一定挂
Chrispp3:不会,写出来也不一定过
点赞 评论 收藏
分享
object3:开始给部分🌸孝子上人生第一课了
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
评论
8
1
分享
牛客网
牛客企业服务