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)