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 num = 0;
  26. int top = 0;
  27. int pop_ptr = 0;
  28. char queue[32] = { 0 };
  29. int stack[32] = { 0 };
  30.  
  31. scanf("%s", queue+1);
  32. for (int i = 1; i < 31; i++) // 입력받은 문자열 queue를 하나씩 stack에 push/pop
  33. {
  34. if (queue[i] == NULL){ // dequeue가 끝나면 계산된 숫자를 출력
  35. break;
  36. }
  37. switch (queue[i]){
  38. case '(': // ( 들어오면 -1로 push
  39. push(&top, -1, stack);
  40. break;
  41. case '[': // [ 들어오면 -2로 push
  42. push(&top, -2, stack);
  43. break;
  44. case ')':
  45. for (int i = top; i >= 0; i--){ // -1 검색해서 pop할 위치 탐색
  46. if (stack[i] == -1) {
  47. pop_ptr = i;
  48. break;
  49. }
  50. }
  51. if (pop_ptr == top){ // pop이 top에서 발생하면
  52. pop(&top, pop_ptr, stack); // 원하는 위치 pop
  53. num = 2;
  54. if (stack[top] > 0){ // +연산 후 다시 push
  55. num += stack[top];
  56. stack[top--] = 0;
  57. }
  58. push(&top, num, stack);
  59. }
  60. else if (pop_ptr != top){ // pop이 중간에 숫자를 끼고 발생하면
  61. pop(&top, pop_ptr, stack); // 원하는 위치 pop
  62. num = 2;
  63. if (stack[top] > 0){ // *연산 후 다시 push
  64. num *= stack[top];
  65. stack[top--] = 0;
  66. }
  67. push(&top, num, stack);
  68. }
  69. break;
  70. case ']':
  71. for (int i = top; i >= 0; i--){
  72. if (stack[i] == -2) {
  73. pop_ptr = i;
  74. break;
  75. }
  76. }
  77. if (pop_ptr == top){ // pop이 top에서 발생하면
  78. pop(&top, pop_ptr, stack); // 원하는 위치 pop
  79. num = 3;
  80. if (stack[top] > 0){ // +연산 후 다시 push
  81. num += stack[top];
  82. stack[top--] = 0;
  83. }
  84. push(&top, num, stack);
  85. }
  86. else if (pop_ptr != top){ // pop이 중간에 숫자를 끼고 발생하면
  87. pop(&top, pop_ptr, stack); // 원하는 위치 pop
  88. num = 3;
  89. if (stack[top] > 0){ // *연산 후 다시 push
  90. num *= stack[top];
  91. stack[top--] = 0;
  92. }
  93. push(&top, num, stack);
  94. }
  95. break;
  96. }
  97. }
  98. if (top == 1) printf("%d\n", stack[top]);
  99. else printf("0\n");
  100. return 0;
  101. }
Success #stdin #stdout 0s 9424KB
stdin
[(])
stdout
6