【資料結構】堆疊(順序棧、鏈棧)的JAVA程式碼實現
阿新 • • 發佈:2019-02-12
堆疊(stack)是一種特殊的線性表,是一種只允許在表的一端進行插入或刪除操作的線性表。表中允許進行插入和刪除操作的一端稱為棧頂,最下面的那一端稱為棧底。棧頂是動態的,它由一個稱為棧頂指標的位置指示器指示。當棧中沒有資料元素時,為空棧。堆疊的插入操作稱為進棧或入棧,堆疊的刪除操作稱為出棧或退棧。
棧的主要特點是“後進先出”,即後進棧的元素先被處理。因此,棧又被稱為後進先出(last in first out,LIFO)表。它的實現方式主要有順序棧、鏈棧兩種。
堆疊的抽象資料型別
- 資料元素:可以為任意型別,只要同屬於一種資料型別即可;
- 資料關係:資料元素之間呈線性關係;
- 資料操作:對堆疊的基本操作定義在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當做鏈棧使用。