• 算法06由两个栈组成的队列


    描述

    用两个栈实现队列,支持队列的基本操作。

    输入描述:

    第一行输入一个整数N,表示对队列进行的操作总数。

    下面N行每行输入一个字符串S,表示操作的种类。

    如果S为"add",则后面还有一个整数X表示向队列尾部加入整数X。

    如果S为"poll",则表示弹出队列头部操作。

    如果S为"peek",则表示询问当前队列中头部元素是多少。

    输出描述:

    对于每一个为"peek"的操作,输出一行表示当前队列中头部元素是多少。

    示例1

    输入:
    6
    add 1
    add 2
    add 3
    peek
    poll
    peek
    
    输出:
    1
    2

    思路

    栈的特点是先进后出,队列的特点是先进先出,用俩个栈正好能把顺序发过来实现类似队列的操作。

    1)一个栈作为压入栈,在压入时只往这个栈中压入,另一个栈作为弹出栈,在弹出数据的时候只从这个栈弹出。

    2)因为数据压入栈的时候顺序是先进后出的,那么只要把压入栈的数据再压入到弹出栈,顺序就变回来了。

    import java.util.Stack;
    import java.util.Scanner;
    
    class TwoStacksQueue{
        public Stack<Integer> stackPush;
        public Stack<Integer> stackPop;
        
        public TwoStacksQueue(){
            stackPush = new Stack<Integer>();
            stackPop = new Stack<Integer>();
        }
        
        public void pushToPop(){
            if(stackPop.empty()){
                while(!stackPush.empty()){
                    stackPop.push(stackPush.pop());
                }
            }
        }
        
        public void add(int pushInt){
            stackPush.push(pushInt);
            pushToPop();
        }
        
        public int poll(){
            if(stackPop.empty() && stackPush.empty()){
                throw new RuntimeException("Queue is empty!");
            }
            pushToPop();
            return stackPop.pop();
        }
        
        public int peek(){
            if(stackPop.empty() && stackPush.empty()){
                throw new RuntimeException("Queue is empty!");
            }
            pushToPop();
            return stackPop.peek();
        }
    }
    
    public class Main{
        public static void main(String[] args){
            
            TwoStacksQueue twostacksqueue = new TwoStacksQueue();
            
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            
            for(int i=0;i<n;i++){
                String op = scanner.next();
                if(op.equals("add")){
                    int x = scanner.nextInt();
                    twostacksqueue.add(x);
                }else if(op.equals("poll")){
                    twostacksqueue.poll();
                }else if(op.equals("peek")){
                    System.out.println(twostacksqueue.peek());
                }
            }
        }
    }
  • 相关阅读:
    状压DP
    string
    hdu3068
    HDU Stealing Harry Potter's Precious(状压BFS)
    状压BFS
    BFS+打印路径
    poj Meteor Shower
    C语言-无符号数与有符号数不为人知的秘密
    keras_实现cnn_手写数字识别
    python_plot画图参数设置
  • 原文地址:https://www.cnblogs.com/sfnz/p/15782018.html
Copyright © 2020-2023  润新知