Java模仿棧和隊列數據構造的根本示例講授。本站提示廣大學習愛好者:(Java模仿棧和隊列數據構造的根本示例講授)文章只能為提供參考,不一定能成為您想要的結果。以下是Java模仿棧和隊列數據構造的根本示例講授正文
棧和隊列:
普通是作為法式員的對象,用於幫助構想算法,性命周期較短,運轉時才被創立;
拜訪受限,在特准時刻,只要一個數據可被讀取或刪除;
是一種籠統的構造,外部的完成機制,對用戶弗成見,好比用數組、鏈表來完成棧。
模仿棧構造
同時,只許可一個數據被拜訪,落後先出
關於入棧和出棧的時光龐雜度都為O(1),即不依附棧內數據項的個數,操作比擬快
例,應用數組作為棧的存儲構造
public class StackS<T> { private int max; private T[] ary; private int top; //指針,指向棧頂元素的下標 public StackS(int size) { this.max = size; ary = (T[]) new Object[max]; top = -1; } // 入棧 public void push(T data) { if (!isFull()) ary[++top] = data; } // 出棧 public T pop() { if (isEmpty()) { return null; } return ary[top--]; } // 檢查棧頂 public T peek() { return ary[top]; } //棧能否為空 public boolean isEmpty() { return top == -1; } //棧能否滿 public boolean isFull() { return top == max - 1; } //size public int size() { return top + 1; } public static void main(String[] args) { StackS<Integer> stack = new StackS<Integer>(3); for (int i = 0; i < 5; i++) { stack.push(i); System.out.println("size:" + stack.size()); } for (int i = 0; i < 5; i++) { Integer peek = stack.peek(); System.out.println("peek:" + peek); System.out.println("size:" + stack.size()); } for (int i = 0; i < 5; i++) { Integer pop = stack.pop(); System.out.println("pop:" + pop); System.out.println("size:" + stack.size()); } System.out.println("----"); for (int i = 5; i > 0; i--) { stack.push(i); System.out.println("size:" + stack.size()); } for (int i = 5; i > 0; i--) { Integer peek = stack.peek(); System.out.println("peek:" + peek); System.out.println("size:" + stack.size()); } for (int i = 5; i > 0; i--) { Integer pop = stack.pop(); System.out.println("pop:" + pop); System.out.println("size:" + stack.size()); } } }
下面的例子,有一個maxSize的劃定,由於數組是要劃定年夜小的,若想無窮制,可使用其他構造來做存儲,固然也能夠new一個新的長度的數組。
例,應用LinkedList存儲來完成棧
public class StackSS<T> { private LinkedList<T> datas; public StackSS() { datas = new LinkedList<T>(); } // 入棧 public void push(T data) { datas.addLast(data); } // 出棧 public T pop() { return datas.removeLast(); } // 檢查棧頂 public T peek() { return datas.getLast(); } //棧能否為空 public boolean isEmpty() { return datas.isEmpty(); } //size public int size() { return datas.size(); } public static void main(String[] args) { StackS<Integer> stack = new StackS<Integer>(3); for (int i = 0; i < 5; i++) { stack.push(i); System.out.println("size:" + stack.size()); } for (int i = 0; i < 5; i++) { Integer peek = stack.peek(); System.out.println("peek:" + peek); System.out.println("size:" + stack.size()); } for (int i = 0; i < 5; i++) { Integer pop = stack.pop(); System.out.println("pop:" + pop); System.out.println("size:" + stack.size()); } System.out.println("----"); for (int i = 5; i > 0; i--) { stack.push(i); System.out.println("size:" + stack.size()); } for (int i = 5; i > 0; i--) { Integer peek = stack.peek(); System.out.println("peek:" + peek); System.out.println("size:" + stack.size()); } for (int i = 5; i > 0; i--) { Integer pop = stack.pop(); System.out.println("pop:" + pop); System.out.println("size:" + stack.size()); } } }
例,單詞逆序,應用Statck構造
public class WordReverse { public static void main(String[] args) { reverse("股份有限公司"); } static void reverse(String word) { if (word == null) return; StackSS<Character> stack = new StackSS<Character>(); char[] charArray = word.toCharArray(); int len = charArray.length; for (int i = 0; i <len; i++ ) { stack.push(charArray[i]); } StringBuilder sb = new StringBuilder(); while (!stack.isEmpty()) { sb.append(stack.pop()); } System.out.println("反轉後:" + sb.toString()); } }
打印:
反轉後:社會式株
模仿隊列(普通隊列、雙端隊列、優先級隊列)
隊列:
先輩先出,處置相似列隊的成績,先排的,先處置,後排的等後面的處置完了,再處置
關於拔出和移除操作的時光龐雜度都為O(1),從前面拔出,早年面移除
雙端隊列:
即在隊列兩頭都可以insert和remove:insertLeft、insertRight,removeLeft、removeRight
含有棧和隊列的功效,如去失落insertLeft、removeLeft,那就跟棧一樣了;如去失落insertLeft、removeRight,那就跟隊列一樣了
普通應用頻率較低,時光龐雜度 O(1)
優先級隊列:
外部保護一個按優先級排序的序列。拔出時須要比擬查找拔出的地位,時光龐雜度O(N), 刪除O(1)
/* * 隊列 先輩先出,一個指針指導拔出的地位,一個指針指導掏出數據項的地位 */ public class QueueQ<T> { private int max; private T[] ary; private int front; //隊頭指針 指導掏出數據項的地位 private int rear; //隊尾指針 指導拔出的地位 private int nItems; //現實數據項個數 public QueueQ(int size) { this.max = size; ary = (T[]) new Object[max]; front = 0; rear = -1; nItems = 0; } //拔出隊尾 public void insert(T t) { if (rear == max - 1) {//已到現實隊尾,從頭開端 rear = -1; } ary[++rear] = t; nItems++; } //移除隊頭 public T remove() { T temp = ary[front++]; if (front == max) {//排隊到尾了,從頭開端 front = 0; } nItems--; return temp; } //檢查隊頭 public T peek() { return ary[front]; } public boolean isEmpty() { return nItems == 0; } public boolean isFull() { return nItems == max; } public int size() { return nItems; } public static void main(String[] args) { QueueQ<Integer> queue = new QueueQ<Integer>(3); for (int i = 0; i < 5; i++) { queue.insert(i); System.out.println("size:" + queue.size()); } for (int i = 0; i < 5; i++) { Integer peek = queue.peek(); System.out.println("peek:" + peek); System.out.println("size:" + queue.size()); } for (int i = 0; i < 5; i++) { Integer remove = queue.remove(); System.out.println("remove:" + remove); System.out.println("size:" + queue.size()); } System.out.println("----"); for (int i = 5; i > 0; i--) { queue.insert(i); System.out.println("size:" + queue.size()); } for (int i = 5; i > 0; i--) { Integer peek = queue.peek(); System.out.println("peek:" + peek); System.out.println("size:" + queue.size()); } for (int i = 5; i > 0; i--) { Integer remove = queue.remove(); System.out.println("remove:" + remove); System.out.println("size:" + queue.size()); } } }
/* * 雙端隊列<span > </span>兩頭拔出、刪除 */ public class QueueQT<T> { private LinkedList<T> list; public QueueQT() { list = new LinkedList<T>(); } // 拔出隊頭 public void insertLeft(T t) { list.addFirst(t); } // 拔出隊尾 public void insertRight(T t) { list.addLast(t); } // 移除隊頭 public T removeLeft() { return list.removeFirst(); } // 移除隊尾 public T removeRight() { return list.removeLast(); } // 檢查隊頭 public T peekLeft() { return list.getFirst(); } // 檢查隊尾 public T peekRight() { return list.getLast(); } public boolean isEmpty() { return list.isEmpty(); } public int size() { return list.size(); } }
/* * 優先級隊列 隊列中按優先級排序,是一個有序的隊列 */ public class QueueQP { private int max; private int[] ary; private int nItems; //現實數據項個數 public QueueQP(int size) { this.max = size; ary = new int[max]; nItems = 0; } //拔出隊尾 public void insert(int t) { int j; if (nItems == 0) { ary[nItems++] = t; } else { for (j = nItems - 1; j >= 0; j--) { if (t > ary[j]) { ary[j + 1] = ary[j]; //前一個賦給後一個 小的在後 相當於用了拔出排序,給定序列原來就是有序的,所以效力O(N) } else { break; } } ary[j + 1] = t; nItems++; } System.out.println(Arrays.toString(ary)); } //移除隊頭 public int remove() { return ary[--nItems]; //移除優先級小的 } //檢查隊尾 優先級最低的 public int peekMin() { return ary[nItems - 1]; } public boolean isEmpty() { return nItems == 0; } public boolean isFull() { return nItems == max; } public int size() { return nItems; } public static void main(String[] args) { QueueQP queue = new QueueQP(3); queue.insert(1); queue.insert(2); queue.insert(3); int remove = queue.remove(); System.out.println("remove:" + remove); } }