1 /*鏈棧*/ 2 /*鏈棧的結構和各種基本操作都類似於線性鏈表 3 *只是要注意它的插入和刪除操作只能在棧頂進行 4 *為了方便操作,我們將鏈表的頭部作為棧頂 5 */ 6 #include<stdio.h> 7 #include<stdlib.h> 8 9 //結構定義 10 typedef struct node 11 { 12 elementType data; 13 struct node *next; 14 } LSNode;//鏈棧節點 15 typedef struct 16 { 17 struct LSNode *top; 18 int size; 19 }*PSTACK;//鏈棧 20 typedef int elementType; 21 22 //基本操作 23 //注意:配合CreatStack(),應該有DisposeStack(PSTACK) 24 PSTACK CreatStack() 25 { 26 PSTACK p=NULL; 27 p=(PSTACK)malloc(sizeof(*PSTACK)); 28 if(p==NULL) 29 { 30 printf("Cannot malloc for PSTACK\n"); 31 //根據內存分配失敗,業務是否還能進行選擇 32 //return NULL; 33 exit(1); 34 } 35 else 36 { 37 p->top=NULL; 38 p->size=0; 39 return p; 40 } 41 } 42 int IsEmpty(PSTACK s) 43 { 44 if(s==NULL) 45 return 1; 46 else 47 return 0; 48 } 49 void PopStack(PSTACK s)//出棧 50 { 51 if(IsEmpty(s)) 52 { 53 printf("Stack is Empty\n"); 54 } 55 else 56 { 57 LSNode*p=NULL; 58 p=s->top->next; 59 free(s->top); 60 s->top=p; 61 s->size--; 62 } 63 } 64 void MakeEmptyStack(PSTACK s)//清空棧 65 { 66 while(s->top!=NULL) 67 { 68 //PopStack()中有重復判斷,不爽大可以重寫 69 PopStack(s); 70 } 71 } 72 void DisposeStack(PSTACK s)//刪除棧 73 { 74 MakeEmptyStack(s); 75 free(s); 76 } 77 void PushStack(elementType x, PSTACK s)//壓棧,入棧 78 { 79 LSNode*p=NULL; 80 p=(LSNode*)malloc(sizeof(LSNode)); 81 if(p==NULL) 82 { 83 printf("Cannot malloc for LSNode\n"); 84 //根據內存分配失敗,業務是否還能進行選擇 85 //return NULL; 86 exit(1); 87 } 88 p->data=x; 89 p->next=s->top; 90 s->top=p; 91 s->size++; 92 } 93 elementType TopStack(PSTACK s)//取棧頂元素 94 { 95 if(s->top==NULL) 96 return NULL; 97 else 98 return s->top->data; 99 } 100 elementType TopAndPop(PSTACK s)//取棧頂元素,並出棧(棧空時返回NULL) 101 { 102 //因為使用此函數前提是已經判斷了棧非空,這里不做重復判斷 103 elementType x; 104 x=TopStack(s); 105 PopStack(s); 106 return x; 107 }