括号配对问题

港控/mmm° 2022-06-16 07:30 386阅读 0赞

括号配对问题,其实是栈的一个应用,很常见也很普通。

栈是最常见的和最重要的数据结构之一,用途非常广泛。它是一种只能在一端进行插入或删除操作的线性表,括号配对是栈的链式储存及其基本运算的实现的结果。刚学时书上有一大堆代码来实现它的基本运算。由于自己也是刚学,只会比葫芦画瓢,正好在南阳oj上看到第二题:

括号配对问题

时间限制: 3000 ms | 内存限制: 65535 KB

难度: 3

描述

现在,有一行括号序列,请你检查这行括号是否配对。

输入

第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有”[“,”]“,”(“,”)”四种字符

输出

每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No

样例输入

  1. 3
  2. [(])
  3. (])
  4. ([[]()])

样例输出

  1. No
  2. No
  3. Yes

来源

网络

上传者

naonao

因为数据结构书上有一道和它类似的题,然后,我就将他的基本运算给打了上去。。。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4. typedef char ElemType;
  5. typedef struct linknode //栈链中数据节点的类型LiStack的定义
  6. {
  7. ElemType data;
  8. struct linknode *next;
  9. }LiStack;
  10. void InitStack(LiStack * &s) //初始化栈
  11. {
  12. s=(LiStack *)malloc(sizeof(LiStack));
  13. s ->next=NULL;
  14. }
  15. void DestroyStack(LiStack * &s) //销毁栈
  16. {
  17. LiStack *p=s, *q=s ->next;
  18. while (q!=NULL)
  19. {
  20. free(p);
  21. p=q;
  22. q=p -> next;
  23. }
  24. free(p);
  25. }
  26. bool StackEmpty(LiStack *s) //判断栈是否为空
  27. {
  28. return (s ->next==NULL);
  29. }
  30. void Push(LiStack * &s,ElemType e) //进栈
  31. {
  32. LiStack *p;
  33. p=(LiStack *)malloc(sizeof(LiStack));
  34. p ->data=e;
  35. p ->next=s->next;
  36. s ->next =p;
  37. }
  38. bool Pop(LiStack * &s,ElemType &e) //出栈
  39. {
  40. LiStack *p;
  41. if (s ->next==NULL)
  42. return false;
  43. p=s ->next;
  44. e=p ->data;
  45. s ->next=p ->next;
  46. free(p);
  47. return true;
  48. }
  49. bool GetTop(LiStack *s,ElemType &e) //取栈顶元素
  50. {
  51. if (s ->next==NULL)
  52. return false;
  53. e=s ->next ->data;
  54. return true;
  55. }
  56. bool Match(char exp[],int n) //编写了一个括号配对的函数
  57. {
  58. int i=0;char e;
  59. bool match=true;
  60. LiStack *st;
  61. InitStack(st);
  62. while (i<n && match)
  63. {
  64. if (exp[i]=='(' || exp[i]=='[')
  65. Push(st,exp[i]);
  66. else if (exp[i]==')')
  67. {
  68. if (GetTop(st,e)==true)
  69. {
  70. if (e!='(')
  71. match = false;
  72. else
  73. Pop(st,e);
  74. }
  75. else match=false;
  76. }
  77. else if (exp[i]==']')
  78. {
  79. if (GetTop(st,e)==true)
  80. {
  81. if (e!='[')
  82. match = false;
  83. else
  84. Pop(st,e);
  85. }
  86. else match=false;
  87. }
  88. i++;
  89. }
  90. if (!StackEmpty(st))
  91. match = false;
  92. DestroyStack(st);
  93. return match;
  94. }
  95. int main() //主函数
  96. {
  97. int len,t;
  98. ElemType str[10005];
  99. scanf("%d",&t);
  100. while (t--)
  101. {
  102. scanf("%s",str);
  103. len=strlen(str);
  104. if (Match(str,len)==true)
  105. printf("Yes\n");
  106. else
  107. printf("No\n");
  108. }
  109. return 0;
  110. }

真的是很长很长的一段代码,不过很幸运竟然ac了,正当我高兴的时候,我看了那上面的最优代码,发现上面的代码比我的要短很多很多,为什么会这样,为此我问了我的数据结构老师,我才知道其实那些基本运算在codeblock上都是有的(我一直用的codeblock写代码),只需你写一个

#include 的头文件来调用它。

于是代码就有了很大的改进:

  1. #include <iostream>
  2. #include <stack>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <cstring>
  6. using namespace std;
  7. int main()
  8. {
  9. int t,i,n;
  10. char a[10005];
  11. cin>>t;
  12. while (t--)
  13. {
  14. stack<char>str; //调用栈
  15. scanf("%s",a);
  16. n=strlen(a);
  17. for (i=0;i<n;i++)
  18. {
  19. if (str.empty()) //判断是否为空
  20. str.push(a[i]);
  21. else
  22. {
  23. if (str.top()+1==a[i]||str.top()+2==a[i])
  24. str.pop(); //如果配对那就让栈顶元素出栈
  25. else
  26. str.push(a[i]);
  27. }
  28. }
  29. if (str.empty()) //如果栈中没有元素则输出yes
  30. cout<<"Yes"<<endl;
  31. else
  32. cout<<"No"<<endl;
  33. }
  34. return 0;
  35. }

通过这个我学到了很多,以前学数据结构,但不知道该怎么用它,这个案例给我做了一个实例。算是一点进步吧。 大笑 大笑 大笑

发表评论

表情:
评论列表 (有 0 条评论,386人围观)

还没有评论,来说两句吧...

相关阅读

    相关 括号配对问题

    描述 现在,有一行括号序列,请你检查这行括号是否配对。 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个

    相关 ACM括号配对问题

    在做南阳理工网站上的 第二 括号配对问题 题目要求如下: 描述 现在,有一行括号序列,请你检查这行括号是否配对。 输入 第一行输入一个数N(0<N<=100),表示有

    相关 括号配对问题

    描述 现在,有一行括号序列,请你检查这行括号是否配对。 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都

    相关 括号配对问题

    括号配对问题,其实是栈的一个应用,很常见也很普通。 栈是最常见的和最重要的数据结构之一,用途非常广泛。它是一种只能在一端进行插入或删除操作的线性表,括号配对是栈的链式储存及