相對於順序棧的空間有限,鏈式棧的操作則更加靈活
#include<stdio.h> #include<malloc.h> typedef int SElemType; //元素類型 typedef int Status; //返回值類型 #define OK 1 //操作成功 #define ERROR 0 //操作失敗 typedef struct StackNode //鏈棧結點結構體 { SElemType date; //節點數據 struct StackNode *next; //節點指針 }*LinkStackPtr; //結點名 typedef struct LinkStack //鏈棧結構體 { LinkStackPtr top; //棧頂指針 int count; //棧結點數量 }LinkStack; //棧名 /*鏈棧的入棧操作*/ Status Push(LinkStack *S, SElemType e) { LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode)); //申請新結點 s->date = e; //新結點的數據等於e s->next = S->top; //新結點的下一結點等於現在的棧頂結點 S->top = s; //棧頂結點等於新結點 S->count++; //棧中數據加1 return OK; } /*鏈棧的出棧操作*/ Status Pop(LinkStack *S, SElemType *e) { if(S->count == 0) //判斷棧是否為空 return ERROR; LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode)); //申請新結點 s = S->top; //新結點等於當前棧頂結點 *e = s->date; //e等於棧頂結點的數據 S->top = s->next; //棧頂等於新結點的下一結點 free(s); //釋放新結點 S->count--; //棧中數據減1 return OK; } void main() { LinkStack S; //創建棧L S.count = 0; //棧頂指針為-1,棧為空 int e; //入棧與出棧的元素 while(true) { printf("請選擇對鏈棧的操作:\n"); printf("1.入棧\n"); printf("2.出棧\n"); printf("3.退出\n"); int a; scanf("%d", &a); switch(a) { case 1: printf("請輸入入棧的元素:"); scanf("%d", &e); if(Push(&S, e)) printf("入棧成功\n"); else printf("入棧失敗\n"); break; case 2: if(Pop(&S, &e)) printf("出棧的元素為:%d\n",e); else printf("棧空\n"); break; case 3: return; default: printf("選擇錯誤\n"); break; } } }