package tx.one; import java.util.ArrayList; import java.util.List; import java.util.Stack; import java.util.Vector; /** * 我們把無限數量 ∞ 的棧排成一行,按從左到右的次序從 0 開始編號。每個棧的的最大容量 capacity 都相同。 實現一個叫「餐盤」的類 DinnerPlates: DinnerPlates(int capacity) - 給出棧的最大容量 capacity。 void push(int val) - 將給出的正整數 val 推入 從左往右第一個 沒有滿的棧。 int pop() - 返回 從右往左第一個 非空棧頂部的值,並將其從棧中刪除;如果所有的棧都是空的,請返回 -1。 int popAtStack(int index) - 返回編號 index 的棧頂部的值,並將其從棧中刪除;如果編號 index 的棧是空的,請返回 -1。 示例: 輸入: ["DinnerPlates","push","push","push","push","push","popAtStack","push","push","popAtStack","popAtStack","pop","pop","pop","pop","pop"] [[2],[1],[2],[3],[4],[5],[0],[20],[21],[0],[2],[],[],[],[],[]] 輸出: [null,null,null,null,null,null,2,null,null,20,21,5,4,3,1,-1] 解釋: DinnerPlates D = DinnerPlates(2); // 初始化,棧最大容量 capacity = 2 D.push(1); D.push(2); D.push(3); D.push(4); D.push(5); // 棧的現狀爲: 2 4 1 3 5 D.popAtStack(0); // 返回 2。棧的現狀爲: 4 1 3 5 D.push(20); // 棧的現狀爲: 20 4 1 3 5 D.push(21); // 棧的現狀爲: 20 4 21 1 3 5 D.popAtStack(0); // 返回 20。棧的現狀爲: 4 21 1 3 5 D.popAtStack(2); // 返回 21。棧的現狀爲: 4 1 3 5 D.pop() // 返回 5。棧的現狀爲: 4 1 3 D.pop() // 返回 4。棧的現狀爲: 1 3 D.pop() // 返回 3。棧的現狀爲: 1 D.pop() // 返回 1。現在沒有棧。 D.pop() // 返回 -1。仍然沒有棧。 提示: 1 <= capacity <= 20000 1 <= val <= 20000 0 <= index <= 100000 最多會對 push,pop,和 popAtStack 進行 200000 次調用。 */ public class Solution19 { static class DinnerPlates { List<Stack> stackList=new ArrayList<>(); //定義一個棧 Stack stack=null; int capacity=0; public static void main(String[] args) { DinnerPlates D = new DinnerPlates(2); D.push(1); D.push(2); D.push(3); D.push(4); D.push(5); D.popAtStack(0); D.push(20); D.push(21); ; D.popAtStack(0); ; D.popAtStack(2); ; D.pop(); D.pop(); D.pop(); D.pop(); D.pop(); } public DinnerPlates(int capacity) { this.capacity=capacity; } public void push(int val) { if (stackList.size()==0) { stack=new Stack(); if(stack.size()<capacity){ stack.push(val);//入棧 stackList.add(stack); } }else{ Boolean flg=false; for (int i = 0; i < stackList.size(); i++) {//從左邊找棧未滿的入棧 Stack stack = stackList.get(i); if(stack.size()>=capacity){ continue; }else{ stack.push(val); flg=true; break; } } if(!flg){ stack= new Stack<>(); stack.push(val); stackList.add(stack); } } } public int pop() { //從右往左出棧第一個非空棧的值 for (int i = stackList.size()-1; i >=0; i--) { Stack stack = stackList.get(i); if(stack.size()==0){ stackList.remove(i); continue; } Integer pop = (Integer) stack.pop(); return pop; } return -1; } public int popAtStack(int index) { Stack stack = stackList.get(index); if(stack==null||stack.size()==0){ return -1; } return (int)stack.pop(); } } }
實現一個叫「餐盤」的類 DinnerPlates
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.