链栈——课上练
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /*此处是链栈数据结构定义*/ 5 typedef int DataType; 6 struct node 7 { 8 DataType info; 9 struct node *link; 10 }; 11 12 typedef struct node *PNode; 13 14 struct LinkStack { 15 PNode top; 16 }; 17 typedef struct LinkStack *PLinkStack; 18 19 20 //第一关 21 PLinkStack createNullStack_link( ) 22 {//此处填写代码,创建一个空的链栈 23 PLinkStack head; 24 /*PNode nul; 25 nul=(PNode)malloc(sizeof(struct node)); 26 nul->link=NULL;*/ 27 head=(PLinkStack)malloc(sizeof(struct LinkStack)); 28 head->top=(PNode)malloc(sizeof(struct node)); 29 if(head!=NULL){ 30 head->top=NULL; 31 } 32 return head; 33 } 34 35 //第二关 36 int isNullStack_link(PLinkStack L) 37 { 38 //判断栈是否为空,若为空,返回值为1,否则返回值为0,若栈不存在,则返回-1 39 if(L==NULL){ 40 return -1; 41 } 42 if(L->top==NULL){ 43 return 1; 44 45 } 46 return 0; 47 } 48 49 50 51 52 //第三关 53 int push_link(PLinkStack L ,DataType x) 54 {//在栈中插入数据元素x,若插入不成功,返回0;插入成功返回值为1 55 if(L==NULL){ 56 return 0; 57 } 58 PNode p = (PNode)malloc(sizeof(struct node)); 59 if(p==NULL){ 60 return; 61 } 62 63 p->info=x; 64 p->link=L->top; 65 L->top=p; 66 return 1; 67 68 } 69 70 71 72 //第四关 73 DataType pop_link(PLinkStack L) 74 {//弹栈并返回删除元素,若栈为空,则返回-1 75 if(L==NULL){ 76 return; 77 } 78 if(L->top==NULL){ 79 return -1; 80 } 81 PNode p=L->top; 82 DataType ans=p->info; 83 // ans=L->top->info; 84 L->top=L->top->link; 85 free(p); 86 return ans; 87 } 88 89 //第五关 90 DataType top_link(PLinkStack L) 91 {// 取栈顶元素返回,若栈为空,则返回-1 92 if(L==NULL){ 93 return; 94 } 95 if(L->top==NULL){ 96 return -1; 97 } 98 return L->top->info; 99 } 100 101 102 //销毁栈,释放栈所占存储空间 103 int destroystack_link(PLinkStack L) 104 { 105 //返回值为销毁的栈中现有数据元素的个数,若待销毁的线性表不存在,则返回0 106 int cnt =0 ; 107 if(L==NULL) return 0; 108 struct node *p = L->top ,*q ; 109 free(L); 110 while(p->link!=NULL) 111 { 112 q = p->link; 113 cnt++; 114 free(p); 115 p = q ; 116 } 117 return cnt ; 118 } 119 120 //第六关 121 122 int balance_symbol(char *s) 123 {//在此处填写代码完成符号配对判断,若配对,返回值为1,否则返回值为0 124 PNode stack= createNullStack_link(); 125 if(stack==NULL){ 126 return 0; 127 } 128 int cnt=0; 129 while(s[cnt]!='\0'){ 130 if(s[cnt]=='('||s[cnt]=='['||s[cnt]=='{'){ 131 push_link(stack,s[cnt]); 132 } 133 if(s[cnt]==')'||s[cnt]==']'||s[cnt]=='}'){ 134 if(abs(s[cnt]-top_link(stack))==1||abs(s[cnt]-top_link(stack))==2){ 135 136 if(!isNullStack_link(stack)){ 137 138 pop_link(stack); 139 } 140 } 141 } 142 cnt++; 143 } 144 if(isNullStack_link(stack)){ 145 return 1; 146 } 147 return 0; 148 }