該文章使用 Google 翻譯處理。
順序棧 (數組實作)
#include <stdio.h>
// 元素 elem 進棧,a 為數組,top 值為目前堆疊的棧頂位置
int push(int* a,int top,int elem)
{
a[++top]=elem;
return top;
}
// 資料元素出棧
int pop(int * a,int top)
{
if (top==-1)
{
printf("空堆疊");
return -1;
}
printf("彈棧元素:%d\n",a[top]);
top--;
return top;
}
int main(void)
{
int a[100];
int top=-1;
top = push(a, top, 1);
top = push(a, top, 2);
top = push(a, top, 3);
top = push(a, top, 4);
top = pop(a, top);
top = pop(a, top);
top = pop(a, top);
top = pop(a, top);
top = pop(a, top);
return 0;
}
輸出結果:
彈棧元素:4
彈棧元素:3
彈棧元素:2
彈棧元素:1
空堆疊
鏈堆疊
#include <stdio.h>
#include <stdlib.h>
typedef struct lineStack{
int data;
struct lineStack * next;
}lineStack;
// stack 為目前的鏈棧,a 表示入棧元素
lineStack* push(lineStack * stack,int a)
{
// 建立儲存新元素的節點
lineStack * line=(lineStack*)malloc(sizeof(lineStack));
line->data=a;
// 新節點與頭節點建立邏輯關係
line->next=stack;
// 更新頭指標的指向
stack=line;
return stack;
}
// 棧頂元素出鏈棧的實作函數
lineStack * pop(lineStack * stack)
{
if (stack)
{
// 宣告一個新指標指向棧頂節點
lineStack * p=stack;
// 更新頭指針
stack=stack->next;
printf("出棧元素:%d ",p->data);
if (stack)
{
printf("新棧頂元素:%d\n",stack->data);
}
else
{
printf("堆疊已空\n");
}
free(p);
}
else
{
printf("棧內沒有元素");
return stack;
}
return stack;
}
int main(void)
{
lineStack * stack=NULL;
stack=push(stack, 1);
stack=push(stack, 2);
stack=push(stack, 3);
stack=push(stack, 4);
stack=pop(stack);
stack=pop(stack);
stack=pop(stack);
stack=pop(stack);
stack=pop(stack);
return 0;
}
輸出結果:
出棧元素:4 新棧頂元素:3
出棧元素:3 新棧頂元素:2
出棧元素:2 新棧頂元素:1
出棧元素:1 堆疊已空
棧內沒有元素