1. 程式人生 > >固定陣列實現佇列與固定陣列實現棧結構

固定陣列實現佇列與固定陣列實現棧結構

 用固定陣列實現棧:(棧:先進後出)

  1. 需要一個變數(index)指示入棧位置同時也是當前出棧的位置(棧進出位置一致,所以只需要一個變數用來指示)判斷棧是否為空或者為滿時,只需要判斷當前位置的小標
  2. 實現棧所需要實現的函式:(1)建構函式構建棧,(2)入棧函式push(3)出棧函式pop(4)得到棧頂的值peek
  3. Index=0時,當前棧空,index=arr.Length時,當前棧滿
  4. 程式碼:
  5.  
    public static class Stack {
    
    		Integer arr[];
    		Integer index;
    
    		// 構建一個棧時的初始化
    		public Stack(int initSize) {
    			if (initSize < 0) {
    				throw new IllegalArgumentException("The init size is less than 0");
    			}
    			arr = new Integer[initSize];
    			index = 0;
    		}
    
    		// 入棧
    		public void push(int a) {
    			if (index == arr.length)
    				throw new ArrayIndexOutOfBoundsException("佇列已滿,不能新增");
    			else {
    				arr[index++] = a;
    			}
    		}
    
    		public Integer peek() {
    			if (index == 0) {
    				System.out.println("棧為空,無元素查詢");
    				//或者丟擲異常或者不丟擲異常返回null
    				return null;
    			} else {
    				return arr[index-1];
    			}
    		}
    
    		public Integer pop() {
    			if (index == 0) {
    				throw new ArrayIndexOutOfBoundsException("棧為空,無元素出棧");
    			} else {
    				return arr[--index];
    			}
    		}
    	}

用固定陣列實現佇列:(佇列:先進先出)

  1. 由於佇列的出佇列與入佇列並不在一個位置,存在隊尾與隊首,所以需要變數startend分別記錄入隊位置與出隊位置,另外,佇列是迴圈形式的,所以需要判斷佇列是否為空,有兩種方式,一種是藉助start與恩典大小進行邊界判斷,另一種是,再增加一個變數size直接記錄佇列大小,判斷是否空滿,這樣start與end相互獨立無關,解耦和
  2. 實現棧所需要實現的函式:(1)建構函式構建佇列,(2)入列函式push(3)出列函式poll(4)得到佇列首的值peek
  3. Start指向佇列頭所在位置(即出隊時元素所在位置),end指向佇列尾的下一個位置(即下一個元素入隊時要插入的位置)
public static class Queue{
		Integer arr[];
		Integer start;
		Integer end;
		Integer size;
		Queue(Integer initSize){
			if(initSize<0)
				throw new IllegalArgumentException("The init size is less than 0");;
			
			arr=new Integer[initSize];
			start=0;
			end=0;
			size=0;
		}
		public void push(int a) {
			if(size==arr.length)
				throw new ArrayIndexOutOfBoundsException("佇列已滿,不能新增");
			size++;
			arr[end]=a;
			end=(end+1)%arr.length;
		}
		//得到元素並不出佇列
		public Integer peek() {
			if(size==0)
				{System.out.println("佇列為空");
				return null;}
			return arr[start];
		}
		public Integer poll() {
			if(size==0)
			{throw new ArrayIndexOutOfBoundsException("佇列為空,無法出隊");
			
			}
			size--;
			int ans=start;
			start=(start+1)%arr.length;
			return arr[ans];
		}
	}

測試程式碼:

public static void main(String []args) {
		Queue s1=new Queue(5);
		s1.push(1);
		s1.push(2);
		s1.push(3);
		s1.push(4);
		s1.push(5);
	//	s1.push(6);
		System.out.println(s1.poll());
		System.out.println(s1.poll());
		System.out.println(s1.poll());
		System.out.println(s1.poll());
		System.out.println(s1.poll());
	//	System.out.println(s1.poll());
		s1.push(19);
		s1.push(7);
		System.out.println(s1.peek());
		System.out.println(s1.poll());
		System.out.println(s1.peek());
		System.out.println(s1.poll());
	}
	
}