用两个栈实现队列,用两个队列实现堆栈

参考:剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈


  • 用两个栈实现队列
    stack1作为入列用,stack2用于出列及暂存
 /**
     * 用两个栈实现一个队列,完成两个函数appendTail和deletedHead,分别是在队列尾部插入节点
     * 和在队列头部删除节点的功能
     */
    private Stack stack1 = new Stack();
    private Stack stack2 = new Stack();

    public void appendTail(String s){
        stack1.push(s);
    }


    public String deletedHead() {
        if(stack2.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }
        if(stack2.isEmpty()){
           throw new Exception("队列为空,不能删除");
        }
        return stack2.pop();
    }
  • 用两个队列实现堆栈
    保证queue1和queue2 只有一个有数据
// 用两个队列来实现栈,完成函数pop()  push(),即分别弹出栈顶数据和 压入数据
    private LinkedList queue1= new LinkedList();
    private LinkedList queue2= new LinkedList();

    public String pop(){
        String re =null;
        if(queue1.size() == 0 && queue2.size() == 0){
           throw new Exception("没有数据,无法出栈");
        }
        if(queue2.size() == 0){
            while(queue1.size() >0){
                re = queue1.removeFirst();
                if(queue1.size() != 0){
                    queue2.addLast(re);
                }
            }
        }else if(queue1.size() == 0){
            while(queue2.size() >0){
                re = queue2.removeFirst();
                if(queue2.size()!=0){
                    queue1.addLast(re);
                }
            }
        }
        return re;
    }


    public String push(String str){
        if(queue1.size() ==0 && queue2.size() == 0){
            queue1.addLast(str);
        }else if(queue1.size()!=0){
            queue1.addLast(str);
        }else if(queue2.size()!=0){
            queue2.addLast(str);
        }
        return str;
    }

你可能感兴趣的:(用两个栈实现队列,用两个队列实现堆栈)