[每日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");
}
好像好久沒寫了,抱歉啦!各位!
下一頁有完整程式碼和輸出