標籤:點資料 ack ++ lse 判斷 status span nod 類型
相對於順序棧的空間有限,鏈式棧的操作則更加靈活
#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; } }}
鏈式棧-C語言實現