`
tubaluer
  • 浏览: 1445615 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

重学数据结构005——栈的应用之平衡符号

 
阅读更多

之前学习了栈的基本操作,并且学习了栈的两种实现方式:链式存储和顺序存储(数组)。现在看看栈都有哪些应用。栈的一个主要应用是平衡符号。

初学者在编写代码并且编译时,难免会因为少写了一个')'和被编译器报错。也就是说,编译器会去匹配括号是否匹配。当你输入了一个'(',很自然编译器回去检查你是否有另一个')'符号与之匹配。如果所有的括号都能够成对出现,那么编译器是能够通过的。否则编译器会报错。例如字符序列“(a+b)”是匹配的,而字符序列"(a+b]"则不是。

在检测括号匹配的算法中使用到了栈,算法描述如下:创建一个空栈,读取字符序列直到结尾。如果字符是开放符号'(''[''{',将其入栈;如果是一个封闭符号')'']''}',则当栈为空时报错。否则,将栈顶元素弹出。如果弹出的符号不是对应的开放符号,则报错。当字符序列结束,判断栈是否为空,为空则报错。

下面是我的实现代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #defineElementTypechar
  4. typedefstructNode*PtrToNode;
  5. typedefPtrToNodeStack;
  6. typedefstructNode
  7. {
  8. ElementTypeElement;
  9. PtrToNodeNext;
  10. };
  11. intIsEmpty(StackS);
  12. StackCreateStack();
  13. voidDisposeStack(StackS);
  14. voidMakeEmpty(StackS);
  15. voidPush(ElementTypeX,StackS);
  16. ElementTypeTop(StackS);
  17. voidPop(StackS);
  18. //判断栈是否为空
  19. intIsEmpty(StackS)
  20. {
  21. returnS->Next==NULL;
  22. }
  23. //创建链栈
  24. StackCreateStack()
  25. {
  26. StackS=malloc(sizeof(structNode));
  27. if(S==NULL)
  28. {
  29. printf("Noenoughmemory!");
  30. returnNULL;
  31. }
  32. S->Next=NULL;
  33. MakeEmpty(S);
  34. returnS;
  35. }
  36. voidMakeEmpty(StackS)
  37. {
  38. if(S==NULL)
  39. {
  40. printf("UseCreateStackFirst!");
  41. }
  42. else
  43. {
  44. while(!IsEmpty(S))
  45. {
  46. Pop(S);
  47. }
  48. }
  49. }
  50. voidPush(ElementTypeX,StackS)
  51. {
  52. PtrToNodeTmp;
  53. Tmp=malloc(sizeof(structNode));
  54. if(Tmp!=NULL)
  55. {
  56. Tmp->Element=X;
  57. Tmp->Next=S->Next;
  58. S->Next=Tmp;
  59. }
  60. else
  61. {
  62. printf("Outofspace!");
  63. }
  64. }
  65. voidPop(StackS)
  66. {
  67. if(IsEmpty(S))
  68. {
  69. printf("TheStackisEmpty!");
  70. }
  71. else
  72. {
  73. PtrToNodeTmp=S->Next;
  74. S->Next=Tmp->Next;
  75. free(Tmp);
  76. }
  77. }
  78. ElementTypeTop(StackS)
  79. {
  80. if(IsEmpty(S))
  81. {
  82. printf("Thestackisempty!");
  83. return0;
  84. }
  85. else
  86. {
  87. returnS->Next->Element;
  88. }
  89. }
  90. //平衡符号判断
  91. voidbalance(char*ch,StackS)
  92. {
  93. ElementTypec;
  94. MakeEmpty(S);
  95. while((c=*ch)!='\0')
  96. {
  97. printf("%c\n",c);
  98. switch(c)
  99. {
  100. case'(':
  101. case'[':
  102. case'{':
  103. Push(c,S);
  104. break;
  105. case')':
  106. if(IsEmpty(S))
  107. {
  108. fprintf(stderr,"Thesymbolsnotbalance!\n");
  109. return;
  110. }
  111. else
  112. {
  113. if(Top(S)=='(')
  114. {
  115. Pop(S);
  116. }
  117. else
  118. {
  119. fprintf(stderr,"Thesymbolsnotbalance!\n");
  120. return;
  121. }
  122. }
  123. break;
  124. case']':
  125. if(IsEmpty(S))
  126. {
  127. fprintf(stderr,"Thesymbolsnotbalance!\n");
  128. return;
  129. }
  130. else
  131. {
  132. if(Top(S)=='[')
  133. {
  134. Pop(S);
  135. }
  136. else
  137. {
  138. fprintf(stderr,"Thesymbolsnotbalance!\n");
  139. return;
  140. }
  141. }
  142. break;
  143. case'}':
  144. if(IsEmpty(S))
  145. {
  146. fprintf(stderr,"Thesymbolsnotbalance!\n");
  147. return;
  148. }
  149. else
  150. {
  151. if(Top(S)=='{')
  152. {
  153. Pop(S);
  154. }
  155. else
  156. {
  157. fprintf(stderr,"Thesymbolsnotbalance!\n");
  158. return;
  159. }
  160. }
  161. break;
  162. default:
  163. break;
  164. }
  165. ch++;
  166. }
  167. if(IsEmpty(S))
  168. {
  169. fprintf(stdout,"TheSymbolsBalance!\n");
  170. }
  171. else
  172. {
  173. fprintf(stderr,"TheSymbolsNotBalance!\n");
  174. }
  175. }
  176. intmain(void)
  177. {
  178. charch[]="(a+b){[d]c*d}{";
  179. StackS=CreateStack();
  180. balance(ch,S);
  181. return0;
  182. }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics