讓我們舉個實例:想像現在有一疊盤子,每當執行一次 "push" 就相當於往上再疊上一個盤子,而執行一次 "pop" 則像是拿走最上面的那一個盤子。
因此,我們可以發現:由於越晚疊入的盤子(資料)在越上層,因此是這個盤子(資料)是越早被取下來的。而這種資料操作方式,我們就稱之為 LIFO (Last In First Out,後入先出)。
也因為這種特性,堆疊的應用範圍相當的廣。像是程式設計函式(function)的呼叫(call)與返回(return)、河內塔(Towers of Hanoi)、算術式轉換等等。這些應用我以後會找機會一一說明,在此不加贅述。
在程式語言中,要實現堆疊有許多種方法,最簡單的方式就是使用陣列模擬。即定義一個大小為 MAX_SIZE 的陣列,並使用一個變數 top 來表示堆疊的頂端。而資料操作的方式可以參考以下虛擬碼:
void push(Stack &stack, Type data)
{
Index top;
if (top = MAX_SIZE)
{
print "The stack is full!";
}
else
{
stack[top] = data;
top = top + 1;
}
}
void pop(Stack &stack)
{
Index top;
if (top = 0)
{
print "The stack is empty!";
}
else
{
top = top - 1;
}
}
當然,除了陣列之外,你也可以使用其他資料結構(例如:連結串列,linked list) 來模擬。另外,在 C++ 的 STL(Standard Template Library,標準樣板庫) 中,也早已實現了堆疊結構及相關函式。不過這些都不在本篇的討論範圍中,有興趣的人就自行摸索囉。
以下是 C 以陣列實現的堆疊原始碼,可以參考看看:
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
void push(int);
void pop(void);
int stack[MAX_SIZE], top = 0;
int main(void)
{
push(0);
push(1);
push(2);
pop();
pop();
push(3);
push(4);
pop();
pop();
pop();
push(5);
push(6);
push(7);
pop();
pop();
pop();
system("pause");
}
void push(int data)
{
if (top == MAX_SIZE)
{
printf("The stack is full!\n");
}
else
{
stack[top++] = data;
}
}
void pop(void)
{
if (top == 0)
{
printf("The stack is empty!\n");
}
else
{
printf("%d\n", stack[--top]);
}
}
0 回覆:
張貼留言