SetOfStacksの実装
・Stackにサイズがあり,サイズを超えてpushしようとすると次のStackにpushされる.
・SetOfStacksクラスからは通常のStackのようにpop(),push()が実行できる.
世界で戦うプログラミング力を鍛える150問の中の一つの問題.
答えは,SetOfStacksクラスにArrayList
とあったのですが,ここでリストを使ってしまうの!? O(n/stackSize)のメモリが必要だし,何よりStackの実装にリスト用いていないのに(本のお手本でだけどね),ここでリストというのが一貫性に欠けるきがする.
ということで自分が考えたのは,
LinkedListNodeでメンバーにLinkedListNodeをもってリンクを表現して,Stackを実装したように,Stackでメンバ−にStackを持ってリンクを表現すればSetOfStacksを表現する.使用メモリも減りそう.バグないかな.
LinkedListNode.java
public class LinkedListNode { public LinkedListNode next; public Object data; public int idx; public LinkedListNode(Object data){ this.data = data; } }
Stack.java
public class Stack { LinkedListNode top; int maxSize = 2; Stack next; public void push(Object data) throws Exception{ if(isFull()) throw new Exception(); LinkedListNode node = new LinkedListNode(data); if(top==null) node.idx = 1; else { node.next = top; node.idx = top.idx + 1; } top = node; } public Object pop() throws Exception{ if(top==null) throw new Exception(); Object data = top.data; top = top.next; return data; } public boolean isFull(){ if(this.top == null) return false; if(this.top.idx == this.maxSize) return true; return false; } }
SetOfStacks.java
public class SetOfStacks { Stack top; public void push(Object data) { if(top != null){ if(!top.isFull()) { try{ top.push(data); }catch(Exception e){} } else { Stack next = new Stack(); try{ next.push(data); }catch(Exception e){} next.next = top; this.top = next; System.out.println("StackSize has expanded!"); } }else{ Stack top = new Stack(); try{ top.push(data); }catch(Exception e){} this.top = top; } } public Object pop() throws Exception{ if(top == null) throw new Exception(); Object data = null; try{ data = top.pop(); }catch(Exception topEmpty){ if(top.next == null) throw new Exception(); else { System.out.println("StackSize has shrinked!"); top = top.next; try{ data = top.pop(); }catch(Exception ee){} } } return data; } public int countStacks(){ int count = 0; Stack now = top; while(now!=null) { count++; now = now.next; } return count; } }