java中基於陣列的棧實現
阿新 • • 發佈:2019-02-03
在java中利用陣列來實現棧以及相關操作。
首先我們要新建一個類,該類中new一個固定大小的陣列,來充當我們的棧,來容納入棧的資料。
在該類中我們可以對棧進行出棧入棧,擴容,和獲取棧頂元素等操作。在該類中我們使用了泛型
和Object類來建立陣列,以便能讓我們的棧存放任意型別的一類資料,而不僅僅侷限於一種資料
型別。
入棧操作:
在入棧操作時,我們首先會判斷棧空間是否足夠,若棧已經滿了,則我們會動態的增加棧的容量,
然後將push入棧的資料放入陣列中。
public E push(E item) { ensureCapacity(size + 1); stack[size++] = item; return item; }
動態增加棧容量:
/**
* 當棧滿的時候,對棧進行擴容
* */
private void ensureCapacity(int size) {
int len = stack.length;
if(size > len) { //陣列已滿
int newLen = 10; //每次陣列擴充的容量
stack = Arrays.copyOf(stack, newLen);
}
}
出棧操作:
在出棧操作的時候,首先會判斷該棧中元素個數是否大於零(即是否是空棧),若是空棧則返回空,
若棧不為空,則返回棧頂資料,並且將出棧的位置置為空。
public E pop() { E e = peek(); //取得棧頂資料 if(size > 0) { //檢查棧中是否有資料 stack[size - 1] = null; //將出棧後的位置置為空 size--; //將棧中元素個數減一 } return e; }
下面是具體實現和測試:
package com.wp.datastruct; import java.util.Arrays; /** * 使用泛型,以便棧中能夠儲存我們想要的資料 * 基於陣列的棧實現 * */ public class MyStack1<E> { private Object[] stack; private int size; //棧中元素的個數 private MyStack1() { stack = new Object[10]; //初始長度為10 } //判斷棧是否為空 public boolean isEmpty() { return size == 0; } /** * 返回棧頂的一個元素,但是不進行出棧操作 * */ public E peek() { if(isEmpty()) { return null; } return (E)stack[size -1]; //返回棧頂元素 } public E pop() { E e = peek(); //取得棧頂資料 if(size > 0) { //檢查棧中是否有資料 stack[size - 1] = null; //將出棧後的位置置為空 size--; } //將棧中元素個數減一 return e; } public E push(E item) { ensureCapacity(size + 1); stack[size++] = item; return item; } /** * 當棧滿的時候,對棧進行擴容 * */ private void ensureCapacity(int size) { int len = stack.length; if(size > len) { //陣列已滿 int newLen = 10; //每次陣列擴充的容量 stack = Arrays.copyOf(stack, newLen); } } /** * 打印出棧中所有的資料 * */ public void printStack() { System.out.println("開始進行出棧:"); while(size > 0) { System.out.println("出棧:" + pop()); } System.out.println("出棧操作結束!"); } //測試棧操作 public static void main(String[] args) { MyStack1<Integer> stack1 = new MyStack1<>(); stack1.push(1); stack1.push(2); stack1.push(3); System.out.println("棧頂元素為:" + stack1.peek()); System.out.println("棧中元素個數為:" + stack1.size); stack1.printStack(); System.out.println("棧中元素個數為:" + stack1.size); } }