說明
堆疊是一種先進後出的資料結構,就如同您將書本放入箱子,最先放進的書本在最後才能拿出來,所有資料的加入與刪除都在堆疊頂端完成。堆疊的使用很廣,遞迴
就是一種堆疊,在之前介紹中序式轉後序式時,也使用到堆疊的結構。
堆疊可以使用多種方式實作,其中使用陣列是最簡單的方法,也最不受使用的程式語言所限制。
解法
堆疊最重要的就是記錄頂端的位置,尤其是在堆疊空間固定的情況下,必須注意堆疊已滿或已空的判斷,當使用陣列實作堆疊時尤其重要。
堆疊的基本操作有五項:建立堆疊、傳回頂端元素、加入元素至堆疊、刪除元素至堆疊、顯示堆疊所有內容。為了方便,加入一個測試堆疊是否為空的方法,詳
細的演算並不難,直接列出程式實作。
實作
#include <stdio.h> #include <stdlib.h> #define MAX 10
int creates(int[]); // 建立堆疊 int isEmpty(int); // 堆疊已空 int stacktop(int[], int); // 傳回頂端元素 int add(int[], int, int); // 插入元素 int delete(int[], int); // 刪除元素 void list(int[], int); // 顯示所有內容
int main(void) { int stack[MAX]; int top; int input, select;
top = creates(stack);
while(1) { printf("\n\n請輸入選項(-1結束):"); printf("\n(1)插入值至堆疊"); printf("\n(2)顯示堆疊頂端"); printf("\n(3)刪除頂端值"); printf("\n(4)顯示所有內容"); printf("\n$c>"); scanf("%d", &select); if(select == -1) break;
switch(select) { case 1: printf("\n輸入值:"); scanf("%d", &input); top = add(stack, top, input); break; case 2: printf("\n頂端值:%d", stacktop(stack, top)); break; case 3: top = delete(stack, top); break; case 4: list(stack, top); break; default: printf("\n選項錯誤!"); } }
printf("\n");
return 0; }
// 以下為堆疊操作的實作 int creates(int stack[]) { int i;
for(i = 0; i < MAX; i++) stack[i] = 0;
return -1; }
int isEmpty(int top) { return (top == -1); }
int stacktop(int stack[], int top) { return stack[top]; }
int add(int stack[], int top, int item) { int t = top;
if(t >= MAX-1) { printf("\n堆疊已滿!"); return t; }
stack[++t] = item;
return t; }
int delete(int stack[], int top) { int t = top;
if(isEmpty(t)) { printf("\n堆疊已空!"); return t; }
return --t; }
void list(int stack[], int top) { int t = top;
printf("\n堆疊內容:"); while(!isEmpty(t)) { printf("%d ", stack[t]); t--; } }
|
|