堆疊(Stack) 是一群相同資料型態的組合, 所有動作均在堆疊頂端進行, 具 "後進先出" (Last in, Fisrt Out, LIFO) 特性. 堆疊結構在電腦中的應用相當廣泛, 時常被用來解決電腦的問題, 例如前面所談到的遞回呼叫, 副程式的呼叫. 至於日常生活中的應用也隨處可以看到, 例如大樓電梯, 貨架上的貨品等等, 都是類似堆疊的資料結構原理.
認識堆疊 :
談到所謂後進先出 (Last In, First Out) 的觀念, 其實就是如同自助餐中的餐盤由桌面往上一個個疊放, 用時則由最上面先拿, 這就是一種典型的堆疊的應用. 由於堆疊是一種抽象型資料結構, 它有以下特性 :
至於堆疊的操作與基本運算具備以下五種工作定義 :
* CREATE : 建立一個空堆疊
* PUSH : 存放頂端資料, 並回傳新堆疊.
* POP : 刪除頂端資料, 並回傳新堆疊.
* EMPTY : 判斷堆疊是否為空堆疊, 是則返回true, 不是則返回 false
* FULL : 判斷堆疊是否已滿, 是則返回 true, 不是則返回 false.
基本上堆疊本身可以使用靜態陣列結構或動態鏈結串列結構來實作, 只要維持堆疊後進先出與從頂端讀取資料的兩個基本原則即可. 以陣列結構來製作堆疊的好處是製作與設計的演算法都相當簡單, 底下將以陣列來作範例介紹 :
範例代碼 :
* JStack.h 代碼 :
- #include
- #define MAXSTACK 100 // 定義最大堆疊量
- using namespace std;
- class JStack{
- protected:
- int *stack;
- int top;
- public:
- JStack(){
- top = -1;
- stack = new int[MAXSTACK];
- }
- ~JStack(){
- delete stack;
- }
- virtual int isEmpty();
- virtual int isFull();
- virtual int push(int data);
- virtual int pop();
- };
- #include "JStack.h"
- int JStack::isEmpty(){
- if(top==-1) return 1;
- else return 0;
- }
- int JStack::isFull(){
- if(top>=MAXSTACK) return 1;
- else return 0;
- }
- int JStack::push(int data){
- if(isFull()) {
- cout << "[堆疊已滿, 無法再加入!]" << endl;
- return 0;
- }else {
- stack[++top] = data;
- return 1;
- }
- }
- int JStack::pop(){
- if(isEmpty()) {
- return -1;
- } else {
- return stack[top--];
- }
- }
- void ch04_01(bool b){
- if(b) {
- int value;
- JStack stack;
- cout << "請依序輸入十筆資料:" << endl;
- for(int i=0; i<10; i++){
- cin >> value;
- stack.push(value);
- }
- cout << "===========================" << endl;
- while(!stack.isEmpty()) {
- cout << "堆疊彈出順序為: " << stack.pop() << endl;
- }
- cout << "===========================" << endl;
- }
- }
執行結果 :
補充說明 :
* [ 資料結構 小學堂 ] 鏈結串列 : 單向鏈結串列
* [ 資料結構 小學堂 ] 陣列結構 : 矩陣的簡介與運算
沒有留言:
張貼留言