fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct {
  6. char *data;
  7. int top;
  8. int capacity;
  9. } Stack;
  10.  
  11. Stack* createStack(int capacity) {
  12. Stack* s = (Stack*)malloc(sizeof(Stack));
  13. s -> capacity = capacity;
  14. s -> top = -1;
  15. s -> data = (char*)malloc(s -> capacity * sizeof(char));
  16. return s;
  17. }
  18.  
  19. int isEmpty(Stack* s) {
  20. return s -> top == -1;
  21. }
  22.  
  23. void push(Stack* s, char c) {
  24. s -> data[++(s -> top)] = c;
  25. }
  26.  
  27. char pop(Stack* s) {
  28. if(isEmpty(s)) return '\0';
  29. return s -> data[(s -> top)--];
  30. }
  31.  
  32. void freeStack(Stack* s) {
  33. free(s -> data);
  34. free(s);
  35. }
  36.  
  37. int isMatching(char open, char close) {
  38. return (open == '(' && close == ')') || (open == '[' && close == ']') || (open == '{' && close == '}');
  39. }
  40.  
  41. int isValidParentheses(const char *s) {
  42. int len = strlen(s);
  43. Stack *st = createStack(len);
  44. for(int i = 0; i < len; i++) {
  45. char c = s[i];
  46. if(c == '(' || c == '[' || c == '{') {
  47. push(st, c);
  48. }
  49. else if(c == ')' || c == ']' || c == '}') {
  50. if(isEmpty(st)) {
  51. freeStack(st);
  52. return 0;
  53. }
  54. char top = pop(st);
  55. if(!isMatching(top, c)) {
  56. freeStack(st);
  57. return 0;
  58. }
  59. }
  60. }
  61.  
  62. int result = isEmpty(st) ? 1 : 0;
  63. freeStack(st);
  64. return result;
  65. }
  66.  
  67. void vanimain() {
  68. char *s = (char*)malloc(100005 * sizeof(char));
  69. if(scanf("%100004s", s) == 1) {
  70. printf("%d\n", isValidParentheses(s));
  71. }
  72. free(s);
  73. }
  74.  
  75. int main() {
  76. vanimain();
  77. return 0;
  78. }
Success #stdin #stdout 0s 5324KB
stdin
(()[][]{}){}{}[][]({[]()})
stdout
1