1. 程式人生 > >Java資料結構與演算法之stack棧

Java資料結構與演算法之stack棧

目錄:
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一致

文章: