實現一個叫「餐盤」的類 DinnerPlates

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();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章