棧java實現。本站提示廣大學習愛好者:(棧java實現)文章只能為提供參考,不一定能成為您想要的結果。以下是棧java實現正文
這幾天,過得挺充實的,每天都在不停的上課,早上很早就起來去跑步,晚上到圖書館看書。一邊緊張的學習,一邊在默默的備戰軟考。最近還接手了一個公司官網的建設。這是我在川信最後的一個完整學期了,每件事我都要認真去做。就算會有失落,會有失敗,會有不甘,也不輕言放棄。
剛剛下去跑了幾圈,吹著夜晚的冷風,在操場狂奔。汗水濕透了全身,滴在鏡片上,我快看不清了遠方。想起很多事來,來川信的兩年,參加了兩次運動會,這是第三次,且每次都是長跑,我享受著這種超越自己的感覺。長跑遠沒有結束,我一直在這條路上。
對於時間的安排,我的重點還是軟考下午的5道大題,算法數據結構,設計模式,數據流圖,數據庫設計,uml例圖,項目設計等。經過這幾天努力,用java實現了常用的幾種數據結構,畫了很多的圖,其中真是奧妙無窮。下一步,是算法設計,然後設計模式等。因為高中學了2年的計算機基礎和網絡知識,所以上午的一知半解。准備通過反復做題和百度練習。將下午的復習完畢之後,將進入全面復習階段。通過真題訓練,反復看書,做題,看代碼,寫代碼。希望通過這次的復習,能夠吸收這些知識轉換為自己的思想,而不是死記硬背,應付考試。
下面是棧的順序存儲結構和鏈式存儲實現:
1 package stack; 2 3 public interface IStack<E> { 4 //1.判斷空棧 5 public boolean isEmpty(); 6 7 //2.判斷棧滿 8 public boolean isMax(); 9 10 //3.入棧 11 public boolean push(E e); 12 13 //4.出棧 14 public E pop(); 15 16 //5.返回棧頂 17 public E peek(); 18 19 //6.返回元素在棧中的位置 20 public int getIndex(E e); 21 22 //7.返回棧的實際長度 23 public int size(); 24 25 //8.返回棧容量 26 public int getStackSize(); 27 28 //9.打印棧 29 public void display(); 30 31 32 33 }
//順序棧
1 package stack; 2 3 //我的棧數據結構 4 public class MyStack<E> implements IStack<E>{ 5 private Object[] data = null; //數據域 6 private int top = -1; //棧頂指針初始化為-1 7 private int maxSize = 0; //棧最大容量 8 9 //默認設置棧容量為10 10 MyStack(){ 11 this(10); 12 } 13 14 public MyStack(int initialSize){ 15 if(initialSize >= 0){ 16 this.data = new Object[initialSize]; //初始化數組 17 this.maxSize = initialSize; //設置棧最大容量 18 this.top = -1; 19 } 20 } 21 22 public boolean isEmpty() { 23 return top == -1 ? true : false; //根據棧頂值判斷,如果棧頂指針沒有更新,則為空棧 24 } 25 26 public boolean isMax() { 27 return top >= maxSize-1 ? true : false; //根據棧頂值判斷,如果棧頂指針大於最大容量,則為滿棧 28 } 29 30 public boolean push(E e) { 31 if(isMax()){ 32 System.err.println("對不起,棧已滿,無法入棧"); 33 return false; 34 } 35 top ++; //更新棧頂下標 36 data[top] = e; //將元素添加到表中 37 // System.out.println("添加" + e + "成功"); 38 return true; 39 } 40 41 @SuppressWarnings("unchecked") 42 public E pop() { 43 if(isEmpty()){ 44 System.err.println("對不起,目前是空棧,沒有元素可以出棧"); 45 return null; 46 } 47 E e = (E) data[top]; //返回當前的棧頂元素 48 top--; //更新棧頂 49 return e; 50 } 51 52 @SuppressWarnings("unchecked") 53 public E peek() { 54 if(isEmpty()){ 55 System.err.println("對不起,目前是空棧,無法返回棧頂元素"); 56 return null; 57 } 58 return (E) data[top]; //返回棧頂元素 59 } 60 61 public int getIndex(E e) { 62 //根據棧頂和棧底(-1)遍歷棧 63 while(top != -1){ 64 //peek()返回當前棧頂 65 if(peek().equals(e)){ 66 return top; 67 } 68 top --; 69 } 70 71 return -1; 72 } 73 74 public int size() { 75 return this.top+1; //棧頂值+1,為棧元素的實際個數 76 } 77 78 public int getStackSize() { 79 return this.maxSize; //返回棧實際長度 80 } 81 82 public void display() { 83 //根據棧頂和棧底(-1)遍歷 84 while(top != -1){ 85 System.out.println(top); 86 top --; 87 } 88 } 89 90 public static void main(String[] args) { 91 MyStack<Integer> stack = new MyStack<Integer>(); 92 //入棧 93 for (int i = 0; i < 10; i++) { 94 stack.push(i); 95 } 96 //出棧 97 // stack.pop(); 98 //返回棧頂 99 // System.out.println(stack.peek()); 100 //求長 101 // System.out.println(stack.size()); 102 103 } 104 105 }
//鏈棧
1 package stack; 2 3 //鏈棧是棧的鏈式存儲結構,由多個節點組成。在鏈棧中的棧頂為頭節點,節點由數據域和指針域組成 4 //對鏈棧的操作都是間接的通過棧頂(頭節點)完成。 5 //順序棧是一種特殊的順序表 6 //鏈棧是一種特殊鏈表 7 public class LinkedStack{ 8 //定義節點類 9 private class Node{ 10 public Object data = null; //數據域 11 public Node next = null; //指針域 12 13 //構造函數初始化 14 @SuppressWarnings("unused") 15 public Node(){} 16 17 public Node(Object data, Node next){ 18 this.data = data; 19 this.next = next; 20 } 21 22 @Override 23 public String toString() { 24 return "Node [data=" + data + ", next=" + next + "]"; 25 } 26 }/*Node*/ 27 28 private Node top = null; //定義棧頂 29 private int size = 0; //定義棧節點數量 30 31 //判斷棧空 32 public boolean isEmpty(){ 33 return size == 0 ? true : false; 34 } 35 36 //壓棧 37 public boolean push(Object obj){ 38 //更新頭節點,讓新節點指向原來的頭節點 39 System.out.println("壓棧成功:" + obj + "指向->" + top); 40 top = new Node(obj, top); //壓棧是將節點插入到棧頂之前。也就是更新頭節點。改變指針指向 41 size ++; //棧長度++ 42 return true; 43 } 44 45 //出棧 46 public Object pop(){ 47 if(isEmpty()){ 48 System.out.println("對不起,目前是空棧,不能出棧"); 49 return null; 50 } 51 Node temp = top; //頭節點引用 52 top = top.next; //更新頭節點 53 temp.next = null; //釋放引用,刪除指針指向 54 size-- ; //棧節點數量-1 55 return temp.data; //出棧 56 } 57 58 //返回棧頂元素,但不彈出棧 59 public Object peek(){ 60 return this.top.data; //直接返回棧頂元素 61 } 62 63 //遍歷棧並打印 64 public void display(){ 65 //從棧頂節點開始到棧底節點null遍歷 66 while(top != null){ 67 System.out.println(top.data); 68 top = top.next; 69 } 70 } 71 72 //返回元素在棧中的位置 73 public int getIndex(Object obj){ 74 int i = 0; 75 while(top != null){ 76 if(peek().equals(obj)){ 77 return i; 78 } 79 top = top.next; 80 i++; 81 } 82 return -1; 83 } 84 85 //返回棧的長度 86 public int getSize(){ 87 return this.size; 88 } 89 90 public static void main(String[] args) { 91 LinkedStack stack = new LinkedStack(); 92 for (int i = 0; i < 10; i++) { 93 stack.push(i); 94 } 95 // stack.display(); 96 System.out.println(stack.getIndex(9)); 97 } 98 99 }
明天更新隊列和樹,然後是圖的深度優先,廣度優先,各種算法。