第一行输入一个整数N,表示对队列进行的操作总数。
下面N行每行输入一个字符串S,表示操作的种类。
如果S为"add",则后面还有一个整数X表示向队列尾部加入整数X。
如果S为"poll",则表示弹出队列头部操作。
如果S为"peek",则表示询问当前队列中头部元素是多少。
对于每一个为"peek"的操作,输出一行表示当前队列中头部元素是多少。
6 add 1 add 2 add 3 peek poll peek
1 2
1<=N<=1000000
-1000000<=X<=1000000
数据保证没有不合法的操作
import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { Queue<Integer> queue = new Queue<Integer>(); Scanner scanner = new Scanner(System.in); int n = Integer.valueOf(scanner.nextLine()); String string; for (int i = 0; i < n; i++) { string = scanner.nextLine(); if (string.equals("poll")) { queue.poll(); } else if (string.equals("peek")) { System.out.println(queue.peek()); } else { queue.offer(Integer.valueOf(string.split(" ")[1])); } } } } class Queue<T>{ private Stack<T> in = new Stack<T>(); private Stack<T> out = new Stack<T>(); public synchronized boolean offer(T item) { in.push(item); return true; } public synchronized T poll() { if (!out.empty()) { return out.pop(); } if (in.empty()) { return null; } while (!in.empty()) { T t = in.pop(); out.push(t); } return out.pop(); } public synchronized T peek(){ if (!out.empty()) { return out.peek(); } if (in.empty()) { return null; } while (!in.empty()) { T t = in.pop(); out.push(t); } return out.peek(); } }
import java.util.*; import java.io.*; import java.math.*; /* 实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。 */ public class Main{ public static void main(String[] args) { InputReader inputReader = new InputReader(); PrintWriter printWriter = new PrintWriter(System.out); inputReader.nextLine(); // 输入 int size = inputReader.nextInt(); // 将 String --> int TwoStackQueue stack = new TwoStackQueue(); for (int i = 0; i < size; i++){ inputReader.nextLine(); // 读取一行 String operate = inputReader.next(); if ("add".equals(operate)){ Integer num = inputReader.nextInt(); stack.add(num); } if ("poll".equals(operate)){ stack.poll(); } if ("peek".equals(operate)){ printWriter.println(stack.peek()); } } printWriter.close(); } } class TwoStackQueue{ public Stack<Integer> stackPush; public Stack<Integer> stackPop; public TwoStackQueue(){ stackPush=new Stack<Integer>(); stackPop=new Stack<Integer>(); } private 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("Your queue is empty."); } pushToPop(); return stackPop.pop(); } public int peek(){ if(stackPop.empty()&&stackPush.empty()){ throw new RuntimeException("Your queue is empty."); } pushToPop(); return stackPop.peek(); } } class InputReader{ BufferedReader buf; // 缓冲字符流 StringTokenizer tok; InputReader(){ // InputStreamReader inputStreamReader = new InputStreamReader(System.in); // buf = new BufferedReader(inputStreamReader); buf = new BufferedReader(new InputStreamReader(System.in)); } boolean hasNext(){ // 为什么用while 而不用if?? 这里在多线程唤醒那里也遇到了 while (tok == null || !tok.hasMoreElements()){ return false; } return true; } // 从缓存中读入一行字符串 void nextLine(){ try { // 创建一个解析给定字符流的tokenizer。 tok = new StringTokenizer(buf.readLine()); } catch (Exception e) { tok = null; } } String next(){ if(hasNext()){ return tok.nextToken(); } return null; } /* 数据类型转换 String --> int,long,double,BigInteger,BigDecimal */ int nextInt(){ return Integer.parseInt(next()); } long nextLong(){ return Long.parseLong(next()); } double nextDouble(){ return Double.parseDouble(next()); } BigInteger nextBigInteger(){ // 将BigInteger的十进制字符串表示形式转换为BigInteger。 return new BigInteger(next()); } BigDecimal nextBigDecimal(){ //将BigDecimal的字符串表示 BigDecimal转换为 BigDecimal 。 return new BigDecimal(next()); } }