【資料結構】堆疊(順序棧、鏈棧)的JAVA程式碼實現

Yngz_Miao發表於2018-03-17

堆疊(stack)是一種特殊的線性表,是一種只允許在表的一端進行插入或刪除操作的線性表。表中允許進行插入和刪除操作的一端稱為棧頂,最下面的那一端稱為棧底。棧頂是動態的,它由一個稱為棧頂指標的位置指示器指示。當棧中沒有資料元素時,為空棧。堆疊的插入操作稱為進棧或入棧,堆疊的刪除操作稱為出棧或退棧。

棧的主要特點是“後進先出”,即後進棧的元素先被處理。因此,棧又被稱為後進先出(last in first out,LIFO)表。它的實現方式主要有順序棧、鏈棧兩種。

 

堆疊的抽象資料型別

  1. 資料元素:可以為任意型別,只要同屬於一種資料型別即可;
  2. 資料關係:資料元素之間呈線性關係;
  3. 資料操作:對堆疊的基本操作定義在IStack中,程式碼如下:
public interface IStack<E> {
	  E push(E item); //入棧
	  E pop(); //出棧
	  E peek(); //取棧頂元素
	  int size(); //返回棧中元素的個數
	  boolean empty(); //判斷棧是否為空
}

 

堆疊的實現方式

順序棧

用一片連續的儲存空間來儲存棧中的資料元素,這樣的棧稱為順序棧。類似於順序表,用一維陣列來存放順序棧中的資料元素。棧頂指示器top設在陣列下標為最大的那一端,top隨著插入或刪除而變化。即當棧為空時,top=-1;其他時候,top為棧頂元素的索引號。

public class SeqStack<E> implements IStack<E> {
	private int maxsize; // 順序棧的容量
	private E[] data; // 陣列,用於儲存順序棧中的資料元素
	private int top; // 指示順序棧的棧頂

	// 初始化棧
	@SuppressWarnings("unchecked")
	public SeqStack(Class<E> type, int size) {
		data = (E[]) Array.newInstance(type, size);
		maxsize = size;
		top = -1;
	}
	// 入棧操作
	public E push(E item) {
		if (!isFull()) {
			data[++top] = item;
			return item;
		}
       else
			return null;
	}
	// 出棧操作
	public E pop() {
		E item = null;
		if (!empty()) {
		item = data[top--];
		}
		return item;
	}

	// 獲取棧頂資料元素
	public E peek() {
		E item = null;
		if (!empty()) {
			item = data[top];
		}
		return item;
	}
	//求棧的長度
		public int size() {
			return top+1;
		}
	// 判斷順序棧是否為空
	public boolean empty() {
		if (top == -1) {
			return true;
		} else {
			return false;
		}
	}
	// 判斷順序棧是否為滿
	public boolean isFull() {
		if (top == maxsize - 1) {
			return true;
		} else {
			return false;
		}
	}
	
}

鏈棧

用鏈式儲存結構儲存的棧稱為鏈棧,鏈棧通常用單連結串列來表示。它的結點結構與單連結串列的結構一樣,都是由資料域data和引用域next兩部分組成。由於鏈棧的操作只在一段進行(棧頂),為了操作方便,我們將棧頂設在連結串列的頭部,即將棧頂指示器指向連結串列的頭部,所有對棧的資料元素的增加和刪除操作都在連結串列頭部進行

public class StackNode<E> {
	private E data; // 資料域
	private StackNode<E> next; // 引用域
	 //建構函式
	public StackNode(){}
	public StackNode(E data) {
		this.data = data;	
	}
	public StackNode(E data, StackNode<E> next) {
		super();
		this.data = data;
		this.next = next;
	}
	//資料域get屬性
	public E getData() {
		return data;
	}
	//資料域set屬性
	public void setData(E data) {
		this.data = data;
	}
	//引用域get屬性
	public StackNode<E> getNext() {
		return next;
	}
	//引用域get屬性
	public void setNext(StackNode<E> next) {
		this.next = next;
	}
}
public class LinkStack<E> implements IStack<E> {
	private StackNode<E> top; // 棧頂指示器
	private int size; // 棧中結點的個數

	// 初始化鏈棧
	public LinkStack() {
		top = null;
		size = 0;
	}
	// 入棧操作
	public E push(E item) {
		StackNode<E> newnode = new StackNode<E>(item);
		if (!empty()) 
			newnode.setNext(top);
		top = newnode;
		++size;
		return item;
	}

	// 出棧操作
	public E pop() {
		E item=null;
		if (!empty())
	      {
	         item = top.getData();
		     top = top.getNext();
		     size--;
	      }    
	      return item;
	}
	// 獲取棧頂資料元素
	public E peek() {
		E item=null;
		if (!empty())
	      {
	       item=top.getData();
	      }
	    return item;
	}

	// 求棧的長度
	public int size() {
		return size;
	}
	// 判斷順序棧是否為空
	public boolean empty() {
		 if ((top == null) && (size == 0))
	      {
	        return true;
	      }
	      else
	      {
	        return false;
	      }
	}
}

 

總結與分析

  • 位於java.util.Stack具有順序棧的功能,LinkedList類提供了在列表開始與結尾新增、刪除和顯示資料元素的方法,使用這些方法把一個LinkedList當做鏈棧使用。

 

相關文章