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 }