zoukankan      html  css  js  c++  java
  • 双栈队列实现快速获取队列最大值最小值

    含有记录栈的数组栈实现,两个记录栈,一个记录最大值,一个记录最小值。
    
    [java] view plaincopy
    import java.util.ArrayList;  
    import java.util.Date;  
    import java.util.List;  
    import java.util.Random;  
      
    public class MaxStack<E extends Comparable<E>> {  
      
        private List<E> stack;  
        private List<E> maxStack;  
        private List<E> minStack;  
      
        public MaxStack() {  
            stack = new ArrayList<E>();  
            maxStack = new ArrayList<E>();  
            minStack = new ArrayList<E>();  
        }  
      
        public int size() {  
            return stack.size();  
        }  
      
        public boolean isEmpty() {  
            return stack.size() == 0;  
        }  
      
        public E push(E e) {  
            if (e == null)  
                return null;  
      
            int count = stack.size();  
            if (count == 0) {  
                stack.add(e);  
                maxStack.add(e);  
                minStack.add(e);  
                return e;  
            }  
      
            stack.add(e);  
            if (maxStack.get(count - 1).compareTo(e) > 0)  
                maxStack.add(maxStack.get(count - 1));  
            else  
                maxStack.add(e);  
      
            if (minStack.get(count - 1).compareTo(e) < 0)  
                minStack.add(minStack.get(count - 1));  
            else  
                minStack.add(e);  
      
            return e;  
        }  
      
        public E pop() {  
            if (stack.size() == 0)  
                return null;  
      
            maxStack.remove(stack.size() - 1);  
            minStack.remove(stack.size() - 1);  
      
            return stack.remove(stack.size() - 1);  
        }  
      
        public E peek() {  
            return stack.size() == 0 ? null : stack.get(stack.size() - 1);  
        }  
      
        public E getMaxE() {  
            return stack.size() == 0 ? null : maxStack.get(stack.size() - 1);  
        }  
      
        public E getMinE() {  
            return stack.size() == 0 ? null : minStack.get(stack.size() - 1);  
        }  
      
        @Override  
        public String toString() {  
            StringBuffer sBuffer = new StringBuffer("STACK");  
            StringBuffer aBuffer = new StringBuffer("MAX");  
            StringBuffer iBuffer = new StringBuffer("MIN");  
            for (int i = 0; i < stack.size(); i++) {  
                sBuffer.append("|" + stack.get(i));  
                aBuffer.append("|" + maxStack.get(i));  
                iBuffer.append("|" + minStack.get(i));  
            }  
            sBuffer.append("
    " + aBuffer + "
    " + iBuffer + "
    ");  
            return sBuffer.toString();  
        }  
      
        public static void main(String[] arg) {  
            MaxStack<Integer> maxStack = new MaxStack<Integer>();  
            Random random = new Random(new Date().getTime());  
            int cur = 0;  
            for (int i = 0; i < 15; i++) {  
                cur = random.nextInt(20);  
                if (cur % 4 != 0)  
                    maxStack.push(cur);  
                else  
                    maxStack.pop();  
                System.out.println(maxStack);  
            }  
        }  
    }  
    使用上述记录栈实现的可以快速获取队列最值的队列
    
    [java] view plaincopy
    import java.util.Date;  
    import java.util.Random;  
      
    public class MaxQueue<E extends Comparable<E>> {  
      
        private MaxStack<E> inStack;  
        private MaxStack<E> outStack;  
      
        public MaxQueue() {  
            inStack = new MaxStack<E>();  
            outStack = new MaxStack<E>();  
        }  
      
        public boolean isEmpty() {  
            return inStack.isEmpty() && outStack.isEmpty();  
        }  
      
        public int size() {  
            return inStack.size() + outStack.size();  
        }  
      
        public E getMaxE() {  
            E in = inStack.getMaxE();  
            E out = outStack.getMaxE();  
            if (in == null && out == null)  
                return null;  
            if (in == null)  
                return out;  
            if (out == null)  
                return in;  
            return in.compareTo(out) > 0 ? in : out;  
        }  
      
        public E getMinE() {  
            E in = inStack.getMinE();  
            E out = outStack.getMinE();  
            if (in == null && out == null)  
                return null;  
            if (in == null)  
                return out;  
            if (out == null)  
                return in;  
            return in.compareTo(out) < 0 ? in : out;  
        }  
      
        private void moveFromInToOut() {  
            while (inStack.size() != 0)  
                outStack.push(inStack.pop());  
        }  
      
        public E peek() {  
            if (outStack.size() == 0 && inStack.size() == 0)  
                return null;  
            if (outStack.size() == 0)  
                moveFromInToOut();  
            return outStack.peek();  
        }  
      
        public E deQueue() {  
            if (outStack.size() == 0 && inStack.size() == 0)  
                return null;  
            if (outStack.size() == 0)  
                moveFromInToOut();  
            return outStack.pop();  
        }  
      
        public E enQueue(E e) {  
            return inStack.push(e);  
        }  
      
        public static void main(String[] arg) {  
            MaxQueue<Integer> maxQueue = new MaxQueue<Integer>();  
            Random random = new Random(new Date().getTime());  
            int cur = 0;  
            for (int i = 0; i < 15; i++) {  
                cur = random.nextInt(20);  
                if (cur % 4 != 0)  
                    System.out.print(maxQueue.enQueue(cur) + "<-");  
                else  
                    System.out.print("<-" + maxQueue.deQueue());  
      
                System.out.println("|Max:" + maxQueue.getMaxE() + "Min|:"  
                        + maxQueue.getMinE());  
            }  
        }  
    } 
    

      

  • 相关阅读:
    Android平台下基于XMPP的IM研究
    Android File数据存储
    Android 获取屏幕分辨率的方式
    Android TabHost 动态修改图标或者动态改变标题
    Android DatePickerDialog用法
    SharedPreference Demo
    progressdialog 去边框
    [LCT学习时的一些笔记]
    [ZJOI2007]最大半连通子图
    【Matrixtree Theorem学习笔记】
  • 原文地址:https://www.cnblogs.com/Vae1990Silence/p/4486054.html
Copyright © 2011-2022 走看看