zoukankan      html  css  js  c++  java
  • java基础——队列

    前言

    java已经提供了堆和栈的相对应的类,这里只是模拟一下队列。

    队列是一种先进先出的线性表。

    基础

    java5中新增加了java.util.Queue接口,用以支持队列的常见操作

    LinkedList类实现了Queue接口

    使用offer()来加入元素,使用poll()来获取并移出元素

    实现:

    public class ceshi {
    
        public static void main(String[] args) {
            //add()和remove()方法在失败的时候会抛出异常(不推荐)
            Queue<String> queue = new LinkedList<String>();
            //添加元素
            queue.offer("a");
            queue.offer("b");
            queue.offer("c");
            queue.offer("d");
            queue.offer("e");
            for (String q : queue) {
                System.out.println(q);
            }
            System.out.println("===");
            System.out.println("poll=" + queue.poll()); //返回第一个元素,并在队列中删除
            for (String q : queue) {
                System.out.println(q);
            }
            System.out.println("===");
            System.out.println("element=" + queue.element()); //返回第一个元素
            for (String q : queue) {
                System.out.println(q);
            }
            System.out.println("===");
            System.out.println("peek=" + queue.peek()); //返回第一个元素
            for (String q : queue) {
                System.out.println(q);
            }
        }
    }
    
    

    两个队列模拟一个堆栈

    /**
     * 两个队列模拟一个堆栈
     * 队列:先进先出
     * 堆栈:先进后出
     * 解决方法:两个队列始终有一个为空,另一个有全部数据,每次取数据,就取完存入另一个队列。
     */
    interface IStack<T> {
    
        void push(T newElement);
    
        T pop();
    
        T top();
    
        int size();
    }
    
    class StackImpl<T> implements IStack<T> {
    
        private Queue<T> queue1 ;
        private Queue<T> queue2;
        private T topRecord;
        private int size;
    
        public StackImpl() {
            this.queue1 = new LinkedList<>();
            this.queue2 = new LinkedList<>();
            this.size = 1;
        }
    
        @Override
        public void push(T newElement) {
            if (queue2.size() == 0) {
                queue1.offer(newElement);
            } else if (queue1.size() == 0) {
                queue2.offer(newElement);
            }
            topRecord = newElement;
            size++;
        }
    
        @Override
        public T pop() {
            T result = null;
            if (size <= 0) {
                return null;
            }
            if (queue2.size() == 0) {
                if (queue1.size() == 1) {
                    topRecord = null;
                    result= queue1.poll();
                }
                while (queue1.size() > 1) {
                    result = queue1.poll();
                    if (queue1.size() == 2) {
                        topRecord = result;
                    }
                    queue2.offer(result);
                }
                result = queue1.poll();
            } else if (queue1.size() == 0) {
                if (queue2.size() == 1) {
                    topRecord = null;
                    result= queue2.poll();
                }
                while (queue2.size() > 1) {
                    result = queue2.poll();
                    if (queue2.size() == 2) {
                        topRecord = result;
                    }
                    queue1.offer(result);
                }
                result = queue2.poll();
            }
            size--;
            return result;
        }
    
        @Override
        public T top() {
            return topRecord;
        }
    
        @Override
        public int size() {
            return this.size;
        }
    }
    
  • 相关阅读:
    DevExpress的GridControl的实时加载数据解决方案(取代分页)
    WinForm程序虚拟分页(实时加载数据)
    C#使用反射特性构建访问者模式
    WinApi学习笔记内存的复制,填充,输出等操作
    PL/SQL学习笔记程序包
    WinApi学习笔记创建进程
    PL/SQL学习笔记触发器
    WinApi学习笔记获取光驱中的信息
    WinApi学习笔记读写文件
    不通过配置文件启动WCF服务
  • 原文地址:https://www.cnblogs.com/birdofparadise/p/10012364.html
Copyright © 2011-2022 走看看