【資料結構】堆疊(順序棧、鏈棧)的JAVA程式碼實現
堆疊(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當做鏈棧使用。
相關文章
- python實現基本資料結構第二篇(順序棧、鏈棧,順序隊、鏈隊)Python資料結構
- 資料結構:棧的基本概念、順序棧、共享棧以及鏈棧資料結構
- 【資料結構】順序棧的實現(c++)資料結構C++
- 順序棧與鏈式棧的圖解與實現圖解
- @資料結構C/C++版(5)《棧的順序儲存結構以及進棧和出棧操作的實現》資料結構C++
- 資料結構 順序棧(c語言)資料結構C語言
- 順序棧、鏈棧基本操作
- C語言資料結構:順序棧的建立、出入棧,以及使用順序棧實現十進位制轉十六進位制C語言資料結構
- Java棧資料結構的實現方式Java資料結構
- 順序棧的實現方式
- 【資料結構】佇列(順序佇列、鏈佇列)的JAVA程式碼實現資料結構佇列Java
- js實現資料結構--棧JS資料結構
- PHP實現簡單順序棧PHP
- 【資料結構】二叉樹(順序儲存、鏈式儲存)的JAVA程式碼實現資料結構二叉樹Java
- 資料結構之php實現棧資料結構PHP
- 順序棧————遍歷、出棧、入棧
- Java版-資料結構-棧Java資料結構
- C語言資料結構:鏈式棧及其出入棧C語言資料結構
- 演算法與資料結構-棧(Stack)-Java實現演算法資料結構Java
- 具體實現程式碼@資料結構探險——順序表資料結構
- 『資料結構與演算法』棧:詳解與程式碼實現資料結構演算法
- 資料結構-棧資料結構
- 資料結構 - 棧資料結構
- 資料結構-js實現棧和佇列資料結構JS佇列
- 資料結構(筆試題-棧(入棧出棧)資料結構筆試
- 演算法題———————輸入棧的入棧順序和出棧順序判斷是否合理演算法
- java實現單連結串列、棧、佇列三種資料結構Java佇列資料結構
- 【資料結構】實現順序表(c++)資料結構C++
- 波波的資料結構-棧資料結構
- 資料結構初階--二叉樹介紹(基本性質+堆實現順序結構)資料結構二叉樹
- 【資料結構】棧的基礎知識(無程式碼)資料結構
- python資料結構之棧、佇列的實現Python資料結構佇列
- 順序棧的簡單操作
- 資料結構之「棧」資料結構
- 資料結構之——棧資料結構
- javascript資料結構 -- 棧JavaScript資料結構
- 資料結構之棧資料結構
- 資料結構(1):棧資料結構