1. 程式人生 > >Java中棧的實現(1)-使用順序儲存結構(陣列)以及實現

Java中棧的實現(1)-使用順序儲存結構(陣列)以及實現

棧和佇列其實是與普通的線性發展而來的,為普通的線性表增加一些特殊的限制就可以得到棧和隊列了。從功能上看,棧和佇列比普通的線性表功能相對弱一點,但是在特殊的場合下,使用棧和佇列更有利,例如,編譯器在實現函式的呼叫的時候需要使用棧來儲存斷點,實現遞迴演算法時候也需要用棧來儲存。

 

棧:一種資料結構,代表只能從一端進行插入、刪除操作的特殊線性表,通常情況下在棧的尾巴進行插入、刪除操作。

對於棧而言,允許插入和刪除操作的是棧頂(top),另一端是棧底(bottom)。一個棧不包含任何元素的時候是一個空棧。從棧頂插入一個元素是進棧,將一個元素插入棧頂被稱為“壓入棧”----對應於英文(push)。從棧頂刪除一個元素被稱為出棧,將一個元素從棧頂刪除被稱為“彈出棧”----對應於英文(pop).

棧:就是一個後進先出(LIFO)線性表。

注意:棧是一個被限制的線性表,不提供從中間任何位置刪除、插入、訪問元素的方法。也就是說棧只能夠在棧頂插入和刪除元素。

棧來自與線性表,因此棧可以使用順序表的方式來實現也可以使用連結串列的方式來實現。

本文是根據順序表來實現棧的使用的語言是Java,下一篇文章中使用連結串列來實現棧

package com.wpl.stackimpl;

import java.util.Arrays;

public class StackImplByArray {
	
	private int DEFAULT_SIZE=10;
	//儲存陣列的長度
	private int capacity;
	//定義當陣列容量不夠的時候,每次增加多少
	private int capacityIncrement=0;
	//定義一個數組來儲存棧的元素
	private Object[] elementData;
	//儲存數序陣列中個數
	private int size=0;
	//一個建構函式
	public StackImplByArray(){
		capacity=DEFAULT_SIZE;
		elementData=new Object[capacity];
		
	}
	
	//獲取棧的大小
	public int getLength()
	{
		return size;
	}
	
	//入棧
	public void push(Object element){
		
		//可能要考慮到陣列的大小是否合適
		elementData=arrayIsFull();
		elementData[size]=element;
		size++;
		
	}
	
	//出棧
	public Object pop(){
		if(size==0)
		{
			throw new NullPointerException("棧為空!");
		}
		
		Object popElement=elementData[size-1];
		elementData[size-1]=null;
		size=size-1;
		return popElement;
		
	}
	
	//來確定看看是否需要新增陣列的大小
	//這種方法效率很低,而且很是麻煩哈
	public Object[] arrayIsFull()
	{
		
		//檢視是否要吧陣列的容積擴大的條件
		if(elementData.length<=size)
		{
			System.out.println("進來!");
			//每次遞增的就是陣列長度的一半
			capacityIncrement=elementData.length/2;
			capacity=elementData.length+capacityIncrement;			
			Object []tempArray=new Object[capacity];
			//注意使用copyOf的這個函式哈,引數不要使用有誤哈!
			tempArray=Arrays.copyOf(elementData, capacity);
			elementData=new Object[capacity];
			elementData=tempArray;
			return elementData;
			
		}else{
			return elementData;
		}
		
		
	}
	
	
	public static void main(String[] args) {
		
		StackImplByArray test=new StackImplByArray();
		test.push(123);
		test.push("wang");
		test.push("test1");
		test.push("test2");
		test.push("test3");
		test.push("test4");
		test.push("test5");
		test.push("test6");
		test.push("test7");
		test.push("test8");
		test.push("test9");
		test.push("test10");
		test.push("test11");
		
		System.out.println(test.pop());
		System.out.println(test.pop());
		System.out.println(test.pop());		
		System.out.println(test.pop());
		
	}
}

上面的程式碼除錯可以通過,希望大家看看,對大家對於棧的理解可以有點幫助。如果還有不是很明白的,可以多看看棧的實現原理,畫畫圖,自己實際的寫寫程式碼。希望對大家都有幫助。