[每日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");
}
好像好久沒寫了,抱歉啦!各位!
下一頁有完整程式碼和輸出
![[每日C] 用副程式(function)計算周長與面積](;https://img.alexleo.click/teambob/2405613966_c68110ca76_o.jpg) 
																			 
																											 
																											![[Linux] 如何使用 LUKS 建立加密的磁碟映像檔](https://img.alexleo.click/Team-BoB_luks_disk_image/pixy.org_97715-small.jpg) 
																											![[筆記] Matplotlib 使用上的一些建議](https://img.alexleo.click/Team-BoB_matplotlib_notes/title.jpg) 
																											![[Git 筆記] merge、squash、rebase 三種方式的比較](https://img.alexleo.click/Team-BoB_git_merge_squash_rebase/cover.jpg) 
																											![[JavaScript] 手把手一起入門(二) – 變數 & 基本操作](;https://img.alexleo.click/teambob/WHATWG_JavaScript_logo.png) 
																											![[Linux] 如何安裝 Eclipse 在 Ubuntu 14.04](;https://img.alexleo.click/teambob/eclipse.png) 
																											![[Linux] 如何在 Ubuntu 14.04 中安裝 Oracle/Open JDK](;https://img.alexleo.click/teambob/java-coffee.png)