fork download
  1. #include <stdio.h>
  2.  
  3. void push(int* top, int c, int* stack){
  4. if ((c>0) && (stack[*top] > 0)){
  5. stack[*top] += c;
  6. return;
  7. }
  8. (*top)++;
  9. stack[*top] = c;
  10.  
  11. return;
  12. }
  13.  
  14. void pop(int* top, int ptr, int* stack){
  15. for (int i = ptr; i < *top; i++){
  16. stack[i] = stack[i + 1];
  17. }
  18. stack[*top] = 0;
  19. (*top)--;
  20. return;
  21. }
  22.  
  23. int main()
  24. {
  25. int i, j, num = 0, top = 0, pop_ptr = 0;
  26. char queue[32] = { 0 };
  27. int stack[32] = { 0 };
  28.  
  29. scanf("%s", queue + 1);
  30. for (i = 1; i < 31; i++)
  31. {
  32. if (queue[i] == NULL){
  33. break;
  34. }
  35. switch (queue[i]){
  36. case '(': // ( 들어오면 -1로 push
  37. push(&top, -1, stack);
  38. break;
  39. case '[': // [ 들어오면 -2로 push
  40. push(&top, -2, stack);
  41. break;
  42. case ')':
  43. for (j = top; j > 0; j--){ // -1 검색해서 pop할 위치 탐색
  44. if (stack[j] == -1) {
  45. pop_ptr = j;
  46. break;
  47. }
  48. }
  49. if (j == 0) { // pop할 것 못찾으면 fail
  50. top = 0;
  51. i = 31;
  52. break;
  53. }
  54. if (pop_ptr == top){ // pop이 top에서 발생하면
  55. pop(&top, pop_ptr, stack); // 원하는 위치 pop
  56. num = 2;
  57. if (stack[top] > 0){ // +연산 후 다시 push
  58. num += stack[top];
  59. stack[top--] = 0;
  60. }
  61. push(&top, num, stack);
  62. }
  63. else if (pop_ptr != top){ // pop이 중간에 숫자를 끼고 발생하면
  64. pop(&top, pop_ptr, stack); // 원하는 위치 pop
  65. num = 2;
  66. if (stack[top] > 0){ // *연산 후 다시 push
  67. num *= stack[top];
  68. stack[top--] = 0;
  69. }
  70. else {
  71. top = 0;
  72. break;
  73. }
  74. push(&top, num, stack);
  75. }
  76. break;
  77. case ']':
  78. for (j = top; j > 0; j--){ // -2 검색해서 pop할 위치 탐색
  79. if (stack[j] == -2) {
  80. pop_ptr = j;
  81. break;
  82. }
  83. if (j == 0) { // pop할 것 못찾으면 fail
  84. top = 0;
  85. i = 31;
  86. break;
  87. }
  88. }
  89. if (pop_ptr == top){ // pop이 top에서 발생하면
  90. pop(&top, pop_ptr, stack); // 원하는 위치 pop
  91. num = 3;
  92. if (stack[top] > 0){ // +연산 후 다시 push
  93. num += stack[top];
  94. stack[top--] = 0;
  95. }
  96. push(&top, num, stack);
  97. }
  98. else if (pop_ptr != top){ // pop이 중간에 숫자를 끼고 발생하면
  99. pop(&top, pop_ptr, stack); // 원하는 위치 pop
  100. num = 3;
  101. if (stack[top] > 0){ // *연산 후 다시 push
  102. num *= stack[top];
  103. stack[top--] = 0;
  104. }
  105. else {
  106. top = 0;
  107. break;
  108. }
  109. push(&top, num, stack);
  110. }
  111. break;
  112. }
  113. }
  114. printf("%d\n", top == 1 ? stack[top] : 0);
  115. return 0;
  116. }
Success #stdin #stdout 0s 9424KB
stdin
(()([())])
stdout
28