棧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 }
明天更新隊列和樹,然後是圖的深度優先,廣度優先,各種算法。