经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
PTA-栈(括弧匹配)
来源:cnblogs  作者:吕STONE  时间:2018/11/9 11:20:13  对本文有异议
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define STACK_INIT_SIZE 10000
  4. #define STACKINCREMENT 10
  5. #define TRUE 1
  6. #define FALSE 0
  7. #define OK 1
  8. #define ERROR 0
  9. #define INFEASIBLE -1
  10. #define OVERFLOW -2
  11. using namespace std;
  12. typedef char SElemType, Status;
  13. typedef struct
  14. {
  15. SElemType *base;
  16. SElemType *top;
  17. int stacksize;
  18. }SqStack;
  19. Status InitStack(SqStack &S)
  20. {
  21. S.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
  22. if (!S.base)
  23. exit(OVERFLOW);
  24. S.top = S.base;
  25. S.stacksize = STACK_INIT_SIZE;
  26. return OK;
  27. }
  28. Status Push(SqStack &S, SElemType e)
  29. {
  30. if (S.top - S.base >= S.stacksize)
  31. {
  32. S.base = (SElemType*)malloc(sizeof(SElemType)*(S.stacksize + STACKINCREMENT));
  33. if (!S.base)
  34. exit(OVERFLOW);
  35. S.top = S.base + S.stacksize;
  36. S.stacksize += STACKINCREMENT;
  37. }
  38. *S.top++ = e;
  39. return OK;
  40. }
  41. Status Pop(SqStack &S)
  42. {
  43. if (S.top == S.base)
  44. return ERROR;
  45. S.top--;
  46. return OK;
  47. }
  48. Status GetTop(SqStack &S, SElemType &e)
  49. {
  50. if (S.base == S.top)
  51. return ERROR;
  52. e = *(S.top - 1);
  53. return OK;
  54. }
  55. Status Empty(SqStack S)
  56. {
  57. if (S.top == S.base)
  58. return OK;
  59. else
  60. return ERROR;
  61. }
  62. const int maxn = 1000 + 5;
  63. char s[maxn];
  64. bool Find(SqStack &S, char ch)
  65. {
  66. char tmp[maxn]; //初始化为“\n”;
  67. memset(tmp, '\n', sizeof(tmp)); //Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
  68. int num = 0;
  69. while (!Empty)
  70. {
  71. SElemType e2;
  72. GetTop(S, e2);
  73. if (e2 == ch)
  74. {
  75. Pop(S);
  76. for (int i = num - 1; i >= 0; i--)
  77. Push(S, tmp[i]);
  78. return true;
  79. }
  80. else
  81. {
  82. tmp[num++] = e2;
  83. }
  84. Pop(S);
  85. }
  86. for (int i = num - 1; i >= 0; i--)
  87. Push(S, tmp[i]);
  88. return false;
  89. }
  90. void judge(char ch)
  91. {
  92. if (ch == '(')
  93. printf("(-?\n");
  94. else if (ch == '[')
  95. printf("[-?\n");
  96. else if (ch == '{')
  97. printf("{-?\n");
  98. else if (ch == '<')
  99. printf("/*-?\n");
  100. }
  101. void fun(SqStack &Sta, char ch)
  102. {
  103. int flag = 1;;
  104. if (!Empty(S)
  105. {
  106. SElemType e;
  107. GetTop(Sta, e);
  108. if (e == '(')
  109. Pop(Sta);
  110. else if (flag)
  111. {
  112. printf("NO\n");
  113. flag = 0;
  114. judge(e);
  115. }
  116. }
  117. }
  118. int main()
  119. {
  120. SqStack Sta;
  121. InitStack(Sta);
  122. int flag = 1;
  123. while (gets(s))
  124. {
  125. if (s[0] == '.') break;
  126. int len = strlen(s);
  127. for (int i = 0; i < len; i++)
  128. {
  129. if (s[i] == '(' || s[i] == '[' || s[i] == '{')
  130. Push(Sta, s[i]);
  131. else if (s[i] == '/'&&s[i + 1] == '*'&&i + 1 < len)
  132. {
  133. ++i;
  134. Push(Sta, '<');
  135. }
  136. else if (s[i] == ')')
  137. {
  138. if (!Empty(Sta)
  139. {
  140. SElemType e;
  141. GetTop(Sta, e);
  142. if (e == '(')
  143. Pop(Sta);
  144. else if (flag)
  145. {
  146. printf("NO\n");
  147. flag = 0;
  148. judge(e);
  149. }
  150. }
  151. else if (flag)
  152. {
  153. flag = 0;
  154. printf("NO\n");
  155. printf("?-)\n");
  156. }
  157. }
  158. else if (s[i] == ']')
  159. {
  160. if (!Empty(Sta)
  161. {
  162. SElemType e;
  163. GetTop(Sta, e);
  164. if (e == '[')
  165. Pop(Sta);
  166. else if (flag)
  167. {
  168. printf("NO\n");
  169. flag = 0;
  170. judge(e);
  171. }
  172. }
  173. else if (flag)
  174. {
  175. flag = 0;
  176. printf("NO\n");
  177. printf("?-]\n");
  178. }
  179. }
  180. else if (s[i] == '}')
  181. {
  182. if (!Empty(Sta)
  183. {
  184. SElemType e;
  185. GetTop(Sta, e);
  186. if (e == '{')
  187. Pop(Sta);
  188. else if (flag)
  189. {
  190. printf("NO\n");
  191. flag = 0;
  192. judge(e);
  193. }
  194. }
  195. else if (flag)
  196. {
  197. flag = 0;
  198. printf("NO\n");
  199. printf("?-}\n");
  200. }
  201. }
  202. else if (s[i] == '*'&&s[i + 1] == '/'&&i + 1 < len)
  203. {
  204. ++i;
  205. if (!Empty(Sta)
  206. {
  207. SElemType e;
  208. GetTop(Sta, e);
  209. if (e == '<')
  210. Pop(Sta);
  211. else if (flag)
  212. {
  213. printf("NO\n");
  214. flag = 0;
  215. judge(e);
  216. }
  217. }
  218. else if (flag)
  219. {
  220. flag = 0;
  221. printf("NO\n");
  222. printf("?-*/\n");
  223. }
  224. }
  225. }
  226. }
  227. if (flag)
  228. {
  229. if (!Empty(Sta)
  230. printf("YES\n");
  231. else
  232. {
  233. SElemType e;
  234. GetTop(Sta, e);
  235. printf("NO\n");
  236. judge(e);
  237. }
  238. }
  239. }
View Code
7-2 符号配对 (20 分)

请编写程序检查C语言源程序中下列符号是否配对:/**/()[]{}

输入格式:

输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。

输出格式:

首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?

输入样例1:

  1. void test()
  2. {
  3. int i, A[10];
  4. for (i=0; i<10; i++) /*/
  5. A[i] = i;
  6. }
  7. .

输出样例1:

  1. NO
  2. /*-?

输入样例2:

  1. void test()
  2. {
  3. int i, A[10];
  4. for (i=0; i<10; i++) /**/
  5. A[i] = i;
  6. }]
  7. .

输出样例2:

  1. NO
  2. ?-]

输入样例3:

  1. void test()
  2. {
  3. int i
  4. double A[10];
  5. for (i=0; i<10; i++) /**/
  6. A[i] = 0.1*i;
  7. }
  8. .

输出样例3:

  1. YES
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号