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. else {
  68. top = 0;
  69. break;
  70. }
  71. push(&top, num, stack);
  72. }
  73. break;
  74. case ']':
  75. for (int i = top; i >= 0; i--){
  76. if (stack[i] == -2) {
  77. pop_ptr = i;
  78. break;
  79. }
  80. }
  81. if (pop_ptr == top){ // pop이 top에서 발생하면
  82. pop(&top, pop_ptr, stack); // 원하는 위치 pop
  83. num = 3;
  84. if (stack[top] > 0){ // +연산 후 다시 push
  85. num += stack[top];
  86. stack[top--] = 0;
  87. }
  88. push(&top, num, stack);
  89. }
  90. else if (pop_ptr != top){ // pop이 중간에 숫자를 끼고 발생하면
  91. pop(&top, pop_ptr, stack); // 원하는 위치 pop
  92. num = 3;
  93. if (stack[top] > 0){ // *연산 후 다시 push
  94. num *= stack[top];
  95. stack[top--] = 0;
  96. }
  97. else {
  98. top = 0;
  99. break;
  100. }
  101. push(&top, num, stack);
  102. }
  103. break;
  104. }
  105. }
  106. if (top == 1) printf("%d\n", stack[top]);
  107. else printf("0\n");
  108. return 0;
  109. }
Success #stdin #stdout 0s 9424KB
stdin
())[]
stdout
5