[每日C] 以陣列實作堆疊概念
實作一堆疊選單,當輸入-1表示結束
範例:
<
p style=”padding-left: 30px;”>請輸入選項(-1結束)
(1) 插入值至堆疊
(2) 顯示堆疊頂端
(3) 刪除頂端值
(4) 顯示所有內容
switch(slection) { case 1: /*(1) 插入值至堆疊*/ break; case 2: /*(2)顯示堆疊頂端*/ break; case 3: /*(3)刪除頂端值*/ break; case 4: /*(4)顯示所有內容*/ break; case -1: break; default: printf("Wrong slection, try again!\n"); break; }
使用 switch-case 判斷使用者的選擇,相信各位都懂!
while (true) { // 印出選單 scanf("%d", &slection); /*switch-case*/ }
用一個 while 無限迴圈包起來,讓使用者可以不斷輸入
if (slection==-1) break;
在 while 後面在加入這個判斷式,在使用者輸入 -1 後 break
printf("\n\n\n");
在 while 底部加上幾個斷行(\n),讓使用者可以容易區分上一次與心一次的執行
void displaySlection() { printf("請輸入選項(-1結束)\n"); printf("\t(1)插入值至堆疊\n"); printf("\t(2)顯示堆疊頂端\n"); printf("\t(3)刪除頂端值\n"); printf("\t(4)顯示所有內容\n"); printf(" > "); }
實作一下印出選單
接下來我們要來弄個定義,方便之後修改(不然要一個一個改變數會很麻煩)
#define MAXSTACK 10
把 STACKMAX 設為 10
接下來要來想一下堆疊的概念,既然我們是用陣列來儲存的話,我們就需要先建立要一個陣列
int stack[MAXSTACK] = {0};
然後,為了確保可以正確存取陣列頂端的元素,我們在加入一個變數top 用來紀錄頂端的位置(從 -1 開始)
int stackTop=-1;
接下來要實作 插入至堆疊(push),概念其實不難,簡單來說,就是每回插入都把頂端加一,然後把值放入即可
我們先把會用到的東西宣告好,等一下編譯器就會提醒我們要得傳;;因為用不到回傳值,所以直接用 void 即可,記住喔!因為我們等一下要修改 stackTop ,所以要以指標方式傳入喔!
void insertStack(int* stack, int* stackTop, int value)
然後在本體設定好每一次插入時的動作(把頂端加一,然後把值放入)
(*stackTop)++; stack[(*stackTop)]=value;
為了避免存取到範圍之外,還需要先判斷一下
if ((*stackTop)+1 > MAXSTACK-1) /* "+1"指的是下一個,"-1"是因為Array Index */ { printf("錯誤, 堆疊已滿!"); } else { (*stackTop)++; stack[(*stackTop)]=value; }
這樣就完成了!
顯示堆疊頂端的部分只需要注意一件事,因為最小權限原則,既然不需要更新 stackTop 的數值,請直接以傳值方式呼叫即可
void displayTop(int* stack, int stackTop) { printf("堆疊頂端為: \n"); printf("[ %d ]", stack[stackTop]); }
刪除頂端的部分就需要更新 stackTop 的數值,所以傳指標(這邊玩了一招,在 void 回傳值的 function 中使用 return 結束執行)
void deleteTop(int* stack, int* stackTop) { if ((*stackTop)<0) { printf("堆疊為空!"); return; } stack[(*stackTop)]=0; (*stackTop)--; printf("堆疊頂端已刪除"); }
印出堆疊的地方小獅使用了一個 for 迴圈來幫忙
void displayStack(int* stack, int stackTop) { printf("堆疊內容為: \n"); printf("["); for (int i=0; i<=stackTop; i++) { printf(" %d ", stack[i]); } printf("]\n"); }
好像好久沒寫了,抱歉啦!各位!
下一頁有完整程式碼和輸出