1. 程式人生 > >java中基於陣列的棧實現

java中基於陣列的棧實現

在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);
	}	
	
}