Java算法手冊讀書筆記 06.數據結構之棧結構

01.什麼是棧結構

棧結構具有特殊的運算規則,是一種線性結構,,在棧結構中只能在一端進行操作,該操作端稱爲棧頂,另一端稱爲棧底,保存和取出數據都只能在棧結構的一端進行,從數據的運算角度來分析其按照“先進後出”的原則處理結點數據。

棧的數據存儲結構有兩種

順序棧結構:使用一組地址連續的內存單元依次保存棧中的數據,在程序中可以定義一個指定大小的結構數組來作爲棧

鏈式棧結構:使用鏈表形式保存棧中各元素的值

在棧結構中,只有棧頂的元素是可以訪問的,所以一般棧的基本操作只有兩個

入棧(push): 將數據保存到棧頂的操作,進行入棧操作前,先修改棧頂引用,使其向上移一個元素位置,然後將數據保存到棧頂引用所指的位置。

出棧(Pop): 將棧頂的數據彈出的操作,通過修改棧頂引用,使其指向棧中下一個元素。

02.使用Java語言實現棧結構

數據結點

package algorithm.chapter02.stack.code;

/**
 * 結點數據
 */
public class DATA {

	public String name;
	
	public int age;
	
}

棧操作

package algorithm.chapter02.stack.code;

public class Stack {

	public static final int MAXLEN = 10;
	
	/**  數據元素  **/
	public DATA[] data = new DATA[MAXLEN+1];
	
	/**  棧頂  **/
	int top;
	
	/**
	 * 初始化
	 * @return
	 */
	public Stack init() {
		Stack p = new Stack();
		p.top = 0;
		return p;
	}
	
	/**
	 * 判斷棧是否爲空
	 * @param s
	 * @return
	 */
	public boolean isEmpty(Stack s) {
		return s.top == 0 ;
	}
	
	/**
	 * 判斷棧是否以滿
	 * @param s
	 * @return
	 */
	public boolean isFull(Stack s) {
		return s.top == MAXLEN ;
	}
	
	/**
	 * 清空棧
	 * @param s
	 */
	public void clear(Stack s) {
		s.top = 0;
		s.data = new DATA[MAXLEN+1];
	}
	
	/**
	 * 釋放棧所用存儲空間
	 * @param s
	 */
	public void free(Stack s) {
		if(s != null) {
			s = null;
		}
	}
	
	/**
	 * 入棧操作
	 * @param s
	 */
	public int push(Stack s , DATA data) {
		if((s.top+1)>MAXLEN) {
			System.out.println("棧溢出");
			return 0;
		}
		s.data[++s.top] = data;
		return 1;
	}
	
	/**
	 * 出棧操作
	 * @param s
	 * @return
	 */
	public DATA pop(Stack s) {
		if(s.top == 0) {
			System.out.println("棧爲空");
			return null;
		}
		return s.data[s.top--];
	}
	
	/**
	 * 讀棧頂數據
	 * @param s
	 * @return
	 */
	public DATA peek(Stack s) {
		if(s.top == 0) {
			System.out.println("棧爲空");
			return null;
		}
		return s.data[s.top];
	}
	
	/**
	 * 由上至下打印棧內數據
	 * @param s
	 * @return
	 */
	public void printStack(Stack s) {
		if(s.top == 0) {
			System.out.println("棧爲空");
		}else {
			for (int i = s.top; i > 0; i--) {
				DATA data = s.data[i];
				System.out.printf("結點%d(%s,%d)\n",i,data.name,data.age);
			}
		}
	}
	
}

測試代碼

package algorithm.chapter02.stack;

import algorithm.chapter02.stack.code.DATA;
import algorithm.chapter02.stack.code.Stack;

public class StackDemo {

	public static void main(String[] args) {
		
		System.out.println("初始化");
		Stack stack = new Stack();
		stack = stack.init();
		for (int i = 0; i < 10; i++) {
			DATA data = new DATA();
			data.name =  "No." + String.valueOf(i);
			data.age = i;
			stack.push(stack, data);
		}
		stack.printStack(stack);
		
		System.out.println("出棧");
		DATA pop = stack.pop(stack);
		System.out.printf("出棧結點(%s,%d)\n",pop.name,pop.age);
		System.out.println("剩餘結點");
		stack.printStack(stack);
		
	}
	
}

執行結果

初始化
結點10(No.9,9)
結點9(No.8,8)
結點8(No.7,7)
結點7(No.6,6)
結點6(No.5,5)
結點5(No.4,4)
結點4(No.3,3)
結點3(No.2,2)
結點2(No.1,1)
結點1(No.0,0)
出棧
出棧結點(No.9,9)
剩餘結點
結點9(No.8,8)
結點8(No.7,7)
結點7(No.6,6)
結點6(No.5,5)
結點5(No.4,4)
結點4(No.3,3)
結點3(No.2,2)
結點2(No.1,1)
結點1(No.0,0)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章