固定陣列實現佇列與固定陣列實現棧結構
阿新 • • 發佈:2018-12-19
用固定陣列實現棧:(棧:先進後出)
- 需要一個變數(index)指示入棧位置同時也是當前出棧的位置(棧進出位置一致,所以只需要一個變數用來指示)判斷棧是否為空或者為滿時,只需要判斷當前位置的小標
- 實現棧所需要實現的函式:(1)建構函式構建棧,(2)入棧函式push(3)出棧函式pop(4)得到棧頂的值peek
- Index=0時,當前棧空,index=arr.Length時,當前棧滿
- 程式碼:
-
public static class Stack { Integer arr[]; Integer index; // 構建一個棧時的初始化 public Stack(int initSize) { if (initSize < 0) { throw new IllegalArgumentException("The init size is less than 0"); } arr = new Integer[initSize]; index = 0; } // 入棧 public void push(int a) { if (index == arr.length) throw new ArrayIndexOutOfBoundsException("佇列已滿,不能新增"); else { arr[index++] = a; } } public Integer peek() { if (index == 0) { System.out.println("棧為空,無元素查詢"); //或者丟擲異常或者不丟擲異常返回null return null; } else { return arr[index-1]; } } public Integer pop() { if (index == 0) { throw new ArrayIndexOutOfBoundsException("棧為空,無元素出棧"); } else { return arr[--index]; } } }
用固定陣列實現佇列:(佇列:先進先出)
- 由於佇列的出佇列與入佇列並不在一個位置,存在隊尾與隊首,所以需要變數start與end分別記錄入隊位置與出隊位置,另外,佇列是迴圈形式的,所以需要判斷佇列是否為空,有兩種方式,一種是藉助start與恩典大小進行邊界判斷,另一種是,再增加一個變數size直接記錄佇列大小,判斷是否空滿,這樣start與end相互獨立無關,解耦和
- 實現棧所需要實現的函式:(1)建構函式構建佇列,(2)入列函式push(3)出列函式poll(4)得到佇列首的值peek
- Start指向佇列頭所在位置(即出隊時元素所在位置),end指向佇列尾的下一個位置(即下一個元素入隊時要插入的位置)
public static class Queue{ Integer arr[]; Integer start; Integer end; Integer size; Queue(Integer initSize){ if(initSize<0) throw new IllegalArgumentException("The init size is less than 0");; arr=new Integer[initSize]; start=0; end=0; size=0; } public void push(int a) { if(size==arr.length) throw new ArrayIndexOutOfBoundsException("佇列已滿,不能新增"); size++; arr[end]=a; end=(end+1)%arr.length; } //得到元素並不出佇列 public Integer peek() { if(size==0) {System.out.println("佇列為空"); return null;} return arr[start]; } public Integer poll() { if(size==0) {throw new ArrayIndexOutOfBoundsException("佇列為空,無法出隊"); } size--; int ans=start; start=(start+1)%arr.length; return arr[ans]; } }
測試程式碼:
public static void main(String []args) {
Queue s1=new Queue(5);
s1.push(1);
s1.push(2);
s1.push(3);
s1.push(4);
s1.push(5);
// s1.push(6);
System.out.println(s1.poll());
System.out.println(s1.poll());
System.out.println(s1.poll());
System.out.println(s1.poll());
System.out.println(s1.poll());
// System.out.println(s1.poll());
s1.push(19);
s1.push(7);
System.out.println(s1.peek());
System.out.println(s1.poll());
System.out.println(s1.peek());
System.out.println(s1.poll());
}
}