1. 程式人生 > >陣列實現固定大小佇列和棧

陣列實現固定大小佇列和棧

棧的資料結構是先進後出,佇列的資料結構是先進先出。

陣列實現固定大小棧的思想是:先建立一個固定大小的陣列和一個size為0的常數,這個常數用來判斷棧是否滿或者空。當push時,檢視size的大小是否為大於陣列的長度,大於就給使用者拋異常,否則就插入陣列的size位置,size++。而pop的時候相反,檢視size的大小是否為小於陣列的長度,小於就給使用者拋異常,否則就把size-1的位置給彈出,size=size-1。獲取棧頂元素就直接返回陣列的size-1位置的數。

陣列實現固定大小佇列的思想是:建立一個固定大小的陣列和三個常數,size作用是計算插入佇列的個數,last的作用是插入佇列時使用,first的作用是彈出佇列時使用。插入佇列時先判斷size是否為陣列的長度,相等就不能插入佇列,否則就size的大小加一,把數插入到陣列的last位置,再判斷last的值是否為陣列大小減1,是的話就給last賦值為0,否則last自加1。彈出佇列也要先判斷size是否為0,為0則不能彈出,否則就size自減1,first位置上的值彈出,再給first賦值,若first值為陣列長度減1,則賦值為0,否則first自加1。佇列頭部的值就為first位置上的值。

程式碼如下:

public class Array_To_Stack_Queue {
	public static void main(String[] args) {

	}
	public static class ArrayStack{
		private Integer[] arr;
		private Integer size;
		//固定大小的棧
		public ArrayStack(int initSize) {
			if(initSize < 0) {
				throw new IllegalArgumentException("The init size is less than 0");
			}
			arr = new Integer[initSize];
			size = 0;
		}
		//返回棧頂元素
		public Integer peek() {
			if(size == null) {
				return null;
			}
			return arr[size - 1];
		}
		//進棧操作
		public void push(int obj) {
			if(size == arr.length) {
				throw new ArrayIndexOutOfBoundsException("The queue is full");
			}
			arr[size++] = obj;
		}
		//出棧操作
		public Integer pop() {
			if(size == 0) {
				throw new ArrayIndexOutOfBoundsException("The queue is empty");
			}
			return arr[--size];
		}
	}
	public static class ArrayQueue {
		private Integer[] arr;
		private Integer size;
		private Integer first;
		private Integer last;
		public ArrayQueue(int initSize) {
			if(initSize < 0) {
				throw new IllegalArgumentException("The init size is less than 0");
			}
			arr = new Integer[initSize];
			size = 0;
			first = 0;
			last = 0;
		}
		//獲取隊頭的值
		public Integer peek() {
			if(size == 0) {
				return null;
			}
			return arr[first];
		}
		//插入佇列
		public void push(int obj) {
			if (size == arr.length) {
				throw new ArrayIndexOutOfBoundsException("The queue is full");
			}
			size++;
			arr[last] = obj;	
			last = last == arr.length - 1 ? 0 : last + 1;
		}
		//彈出佇列
		public Integer poll() {
			if(size == 0) {
				throw new ArrayIndexOutOfBoundsException("The queue is empty");
			}
			size--;//佇列的個數減一
			int tmp = first;
			first = first == arr.length - 1 ? 0 : first + 1;
			return arr[tmp];
		}
	}
}