java數據結構- - - -棧
阿新 • • 發佈:2018-10-05
peek 原理 特殊 linked int todo 返回棧 his 鏈棧的實現
棧:是一種容器,類似於桶一樣,棧是一種特殊的線性表,不同於一般線性表的是,一般線性表可以在表內任意位置添加和刪除元素,
而棧只可以在尾端進行,棧尾一般稱之為棧頂,另一端稱之為棧底,特點是:後進先出/先進後出。
而一般常見使用的有 順序棧 和 鏈棧;順序棧類似於數組一樣,而鏈棧就是用鏈表實現的,鏈棧的結點特點需要有指針域和數值域。
這裏首先放上順序棧常見功能的實現:
1 package com.demo.stackone; 2 3 /** 4 Author:yao 5 Date:2018年9月20日 6 Description:面試被問到棧的實現於是回來再在這裏溫習一下啊 7 8 首先:介紹一下棧,棧是一種特殊的線性表,不同於一般線性表的是,一般線性表可以在表內任意位置添加和刪除元素,9 而棧只可以在尾端進行,棧尾一般稱之為棧頂,另一端稱之為棧底,特點是:後進先出/先進後出 10 11 stack的接口相關實現類 12 * 13 */ 14 public class StackDemo implements IStack { 15 private Object[] stackElem;//定義元素對象數組 16 private int top;//在棧為非空的情況下,top始終指向棧頂元素的下一個存儲位置;當棧為空時,top值為0; 17 18 public StackDemo(int MaxSize) { 19 top = 0; 20 stackElem = newObject[MaxSize]; 21 } 22 23 @Override 24 //清空棧 25 public void clear() { 26 top = 0; 27 } 28 29 @Override 30 //判斷棧是否為空 31 public boolean isEmpty() { 32 return top == 0; 33 34 } 35 36 @Override 37 //棧內元素個數 38 public int length() { 39 returntop; 40 41 } 42 43 @Override 44 //獲取棧頂元素 45 public Object peek() { 46 if (!isEmpty()) { 47 return stackElem[top - 1]; 48 } else { 49 return null; 50 } 51 52 } 53 54 //入棧操作 55 @Override 56 public void push(Object o) throws Exception { 57 if (top == stackElem.length) { 58 throw new Exception("棧已滿"); 59 } else { 60 stackElem[top++] = o; 61 } 62 } 63 64 //出棧操作 65 @Override 66 public Object pop() { 67 if (isEmpty()) { 68 return null; 69 } else { 70 return stackElem[--top]; 71 } 72 73 } 74 75 //輸出棧內所有元素(棧頂--->棧底) 76 public void printAllElement() { 77 for (int i = top - 1; i >= 0; i--) { 78 System.out.print(stackElem[i].toString() + " "); 79 } 80 } 81 82 }
然後再加上鏈棧常用功能的實現,首先鏈棧需要先添加一個Node類,屬性用來存放指針域和數值域,所以先看Node類的定義
1 package com.demo.linkstack; 2 3 /** 4 Author:yao 5 Date:2018年10月5日 6 Description:鏈表需要定義Node類,定義三大屬性,(數據域,後指針) 7 * 8 */ 9 public class Node { 10 private Object data; 11 private Node next; 12 13 public Node() { //初始化一個空結點 14 super(); 15 // TODO Auto-generated constructor stub 16 } 17 18 public Node(Object data) { //構造一個數據域指針為指定值,指針域為空的結點 19 super(); 20 this.data = data; 21 } 22 23 public Node(Object data, Node next) { //帶有數據域和指針的結點 24 super(); 25 this.data = data; 26 this.next = next; 27 } 28 29 public Object getData() { 30 return data; 31 } 32 33 public void setData(Object data) { 34 this.data = data; 35 } 36 37 public Node getNext() { 38 return next; 39 } 40 41 public void setNext(Node next) { 42 this.next = next; 43 } 44 45 @Override 46 public String toString() { 47 return "Node [data=" + data + ", next=" + next + "]"; 48 } 49 50 }
然後我們再來看鏈棧具體功能的實現
package com.demo.linkstack; /** Author:yao Date:2018年10月5日 Description:鏈棧的實現原理 * */ public class LinkedStack implements LinkStack { private Node top; //棧頂元素的引用 //將棧置空 @Override public void clear() { top = null; } //判斷棧是否為空 @Override public boolean isEmpty() { return top == null; } //獲得棧的長度 @Override public int length() { Node p = top; int length = 0; while (p != null) { p = p.getNext(); ++length; } return length; } //獲取棧頂元素並且返回 @Override public Object peek() { if (!isEmpty()) { return top; } else { return null; } } //入棧 @Override public void push(Object o) throws Exception { Node node = new Node(o); node.setNext(top); top = node; } //出棧 @Override public Object pop() { if (isEmpty()) { return null; } else { Node p = top; //指向要被刪除的結點 top = top.getNext();//修改頂部指針,原來頂部的下一個節點現在為新的棧頂 return p.getData(); //返回新的棧頂元素數值 } } //輸出鏈棧中的所有元素 public void printAll() { Node p = top; while (p != null) { System.out.print(p.getData().toString() + " "); p = p.getNext(); } } }
上述代碼都是實現了接口,所以把接口的定義放上去
public interface LinkStack { public void clear();//清空棧 public boolean isEmpty();//判斷棧是否為空 public int length();//返回棧中元素的個數 public Object peek();//取棧頂元素並且返回其值,如果棧是空,就返回null public void push(Object o) throws Exception;//入棧 public Object pop();//出棧 }
java數據結構- - - -棧