Java資料結構與演算法之stack棧
阿新 • • 發佈:2019-02-16
目錄:
1.棧概述
2.陣列實現自定義棧
3.連結串列實現自定義棧
4.集合實現自定義棧
1.棧概述
棧和佇列一樣,也是線性表的一種,它唯一的特點是需要滿足先進後出(FILO)的規則,也就是隻能對棧的一頭進行操作,新增資料
稱為壓棧,移除資料稱為彈棧。而在java中棧的實現可以通過陣列,連結串列,集合(ArrayList/LinkedList)3種方式進行實現。
2.陣列實現自定義棧
(1)自定義棧介面CustomStack.java
(2)陣列自定義棧類CustomArrayStack.java
(3)測試類CustomArrayStackTest.java
(4)測試控制檯輸出
3.連結串列實現自定義棧
(1)自定義棧介面CustomStack.java(與2一致)
(2)連結串列自定義棧類CustomLinkedStack.java
(3)測試類CustomLinkedStackTest.java
(4)測試結果與2一致
4.集合實現自定義棧
(1)自定義棧介面CustomStack.java(與2一致)
(2)集合類LinkedList實現棧自定義CustomCollectionStack.java
(3)測試類CustomCollectionStackTest.java
1.棧概述
2.陣列實現自定義棧
3.連結串列實現自定義棧
4.集合實現自定義棧
1.棧概述
棧和佇列一樣,也是線性表的一種,它唯一的特點是需要滿足先進後出(FILO)的規則,也就是隻能對棧的一頭進行操作,新增資料
稱為壓棧,移除資料稱為彈棧。而在java中棧的實現可以通過陣列,連結串列,集合(ArrayList/LinkedList)3種方式進行實現。
2.陣列實現自定義棧
(1)自定義棧介面CustomStack.java
package com.datastructure.test; public interface CustomStack<T> { //壓棧方法 public void push(T data)throws Exception; //彈棧/移除頂部元素,並返回對應的資料 public T pop()throws Exception; //獲取stact第一個元素 public T peek(); //判斷棧是否為空 public boolean empty(); //返回棧中元素的個數 public int size(); }
(2)陣列自定義棧類CustomArrayStack.java
package com.datastructure.test; public class CustomArrayStack<T> implements CustomStack<T> { static final int defaultSize = 15; //指示頂部元素的位置 private int size; private T[] arrays; /* * 無參構造方法,做一些初始化的操作 */ @SuppressWarnings("unchecked") public CustomArrayStack() { size = 0; arrays = (T[]) new Object[defaultSize]; } /* * 根據使用者自定義陣列大小初始化陣列 */ @SuppressWarnings("unchecked") public CustomArrayStack(int customSize) { size = 0; arrays = (T[]) new Object[customSize]; } /* * 向棧頂新增元素 */ @Override public void push(T data) throws Exception { if (size<arrays.length) { arrays[size] = data; size++; }else { throw new Exception("陣列棧已經滿啦!"); } } /* * 將棧頂的元素移除 */ @Override public T pop() throws Exception { T topData; if (empty()) { throw new Exception("陣列棧為空!"); }else { topData = arrays[size-1]; size--; } return topData; } /* * 獲取棧頂的元素 */ @Override public T peek() { return arrays[size-1]; } /* * 判斷棧是否為空 */ @Override public boolean empty() { return size==0; } /* * 返回棧的長度 */ @Override public int size() { return size; } }
(3)測試類CustomArrayStackTest.java
package com.datastructure.test; public class CustomArrayStackTest { public static void main(String[] args) { CustomArrayStack<String> stack = new CustomArrayStack<>(10); System.out.println("是否為空:"+stack.empty()); try { stack.push("I"); stack.push("am"); stack.push("andy"); } catch (Exception e) { e.printStackTrace(); } System.out.println("棧頂元素:"+stack.size()); System.out.println("棧頂元素:"+stack.peek()); try { System.out.println("移除元素:"+stack.pop()); } catch (Exception e) { e.printStackTrace(); } System.out.println("棧頂元素:"+stack.size()); System.out.println("棧頂元素:"+stack.peek()); } }
(4)測試控制檯輸出
是否為空:true
棧長度:3
棧頂元素:andy
移除元素:andy
棧長度:2
棧頂元素:am
3.連結串列實現自定義棧
(1)自定義棧介面CustomStack.java(與2一致)
(2)連結串列自定義棧類CustomLinkedStack.java
package com.datastructure.test;
public class CustomLinkedStack<T> implements CustomStack<T> {
private int size;
private Node topNode;
@Override
public void push(T data) throws Exception {
Node newTopNode;
if (empty()) {
newTopNode = new Node(data, null);
}else {
newTopNode = new Node(data, topNode);
}
topNode = newTopNode;
size++;
}
@Override
public T pop() throws Exception {
Node oldTopNode = topNode;
topNode = topNode.nextNode;
size--;
return oldTopNode.data;
}
@Override
public T peek() {
return topNode.data;
}
@Override
public boolean empty() {
return size==0;
}
@Override
public int size() {
return size;
}
/**
* 節點內部類
*/
class Node{
private T data;
private Node nextNode;
public Node(T data,Node nextNode){
this.data = data;
this.nextNode = nextNode;
}
}
}
(3)測試類CustomLinkedStackTest.java
package com.datastructure.test;
public class CustomLinkedStackTest {
public static void main(String[] args) {
CustomLinkedStack<String> stack = new CustomLinkedStack<>();
System.out.println("是否為空:"+stack.empty());
try {
stack.push("I");
stack.push("am");
stack.push("andy");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("棧長度:"+stack.size());
System.out.println("棧頂元素:"+stack.peek());
try {
System.out.println("移除元素:"+stack.pop());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("棧長度:"+stack.size());
System.out.println("棧頂元素:"+stack.peek());
}
}
(4)測試結果與2一致
4.集合實現自定義棧
(1)自定義棧介面CustomStack.java(與2一致)
(2)集合類LinkedList實現棧自定義CustomCollectionStack.java
package com.datastructure.test;
import java.util.LinkedList;
class CustomCollectionStack<T> implements CustomStack<T> {
private LinkedList<T> linkedList = new LinkedList<>();
public CustomCollectionStack() {
}
@Override
public void push(T data) throws Exception {
linkedList.add(data);
}
@Override
public T pop() throws Exception {
return linkedList.removeLast();
}
@Override
public T peek() {
return linkedList.getLast();
}
@Override
public boolean empty() {
return linkedList.isEmpty();
}
@Override
public int size() {
return linkedList.size();
}
}
(3)測試類CustomCollectionStackTest.java
package com.datastructure.test;
public class CustomCollectionStackTest {
public static void main(String[] args) {
CustomCollectionStack<String> stack = new CustomCollectionStack<>();
System.out.println("是否為空:"+stack.empty());
try {
stack.push("I");
stack.push("am");
stack.push("andy");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("棧長度:"+stack.size());
System.out.println("棧頂元素:"+stack.peek());
try {
System.out.println("移除元素:"+stack.pop());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("棧長度:"+stack.size());
System.out.println("棧頂元素:"+stack.peek());
}
}
(4)結果與2一致
文章: