括号匹配

冷不防 2022-02-27 15:54 382阅读 0赞

PTA 02:括号匹配

一、题目

给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。

输入格式:
输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。

输出格式:
如果括号配对,输出yes,否则输出no。
输入样例1:
sin(10+20)
输出样例1:
yes
输入样例2:
{[}]
输出样例2:
no


二、代码

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. typedef struct Node{
  6. char data;
  7. // 数据域
  8. struct Node*next;
  9. // 指针域
  10. }StackNode,*LinkStack;
  11. //初始化:构造一个空栈
  12. void InitStack(LinkStack &S)
  13. {
  14. S=NULL;
  15. }
  16. //获取数据
  17. char GetTop(LinkStack &S){
  18. if(S!=NULL)
  19. return S->data;
  20. }
  21. // 入栈
  22. void Push(LinkStack &S,char ch)
  23. {
  24. LinkStack p;
  25. p=new StackNode;
  26. // 生成新结点
  27. p->data=ch;
  28. // 将新结点数据域置为e
  29. p->next=S;
  30. // 将新结点插入栈顶
  31. S=p;
  32. // 修改栈顶指针为p
  33. }
  34. // 出栈
  35. void Pop(LinkStack &S,char ch)
  36. {
  37. LinkStack p;
  38. ch=S->data;
  39. p=S;
  40. S=S->next;
  41. delete p;
  42. }
  43. bool StackEmpty(LinkStack S){
  44. if(S == NULL)
  45. {
  46. return 1;}
  47. else{
  48. return 0;
  49. }
  50. }
  51. int main()
  52. {
  53. LinkStack p;
  54. LinkStack S;
  55. InitStack(S);
  56. int flag=1;
  57. // 这里的flag的使用是为了解决反复进行判断、退出的麻烦
  58. char ch[100];
  59. cin.getline(ch,100);
  60. // 用普通cin 会将空格看作停止输入的符号,但是题目中输入的字符串中是可以有空格的,所以选用getline获取一行中的字符串
  61. for(int i=0;i<strlen(ch);i++)
  62. {
  63. switch(ch[i])
  64. {
  65. case '(':
  66. case '[':
  67. case '{':
  68. Push(S,ch[i]);
  69. // 每遇到符合要求的“左括号”将其压入栈
  70. break;
  71. case ')':
  72. if(!StackEmpty(S) && GetTop(S)=='(')
  73. Pop(S,ch[i]);
  74. // 当前面有左括号与之匹配,将其压出栈
  75. else
  76. flag=0;
  77. break;
  78. case ']':
  79. if(!StackEmpty(S) && GetTop(S)=='[')
  80. Pop(S,ch[i]);
  81. else
  82. flag=0;
  83. break;
  84. case '}':
  85. if(!StackEmpty(S) && GetTop(S)=='{')
  86. Pop(S,ch[i]);
  87. else
  88. flag=0;
  89. break;
  90. }
  91. }
  92. if(StackEmpty(S) && flag)
  93. cout<<"yes";
  94. else
  95. cout<<"no";
  96. return 0;
  97. }

三、经验总结

这道题的思路是出现一次( 、[ 、 { 将其压入栈,如果栈非空且出现与之对应的右括号就将其出栈,这个功能可以由函数match实现
现在比较明确需要push pop match init这些函数了,我们只需把他们写好,重点就是match函数。
但是还有一些细节问题需要注意。
1、为什么用getline不用cin?
如果你试试cin就会发现程序对是对的,但是在PTA上就说你超时,后来改进一下,不用一个一个的输,直接一行一行的看,这里就用到getline函数,但是注意包含头文件#include喔!
2、flag是干啥的
港真~我开始是没想到用flag的,但是后来发现按照我的思路写,隔三差五就会进行判断,不合条件的就退出,结果程序显得很冗长。这时就引入了flag,每次要退出,我只需把flag改为0,到后来“算总账”,flag为0的统统退出。

发表评论

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

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

相关阅读

    相关 表达式括号匹配

    题目描述 假设一个表达式有英文字母(小写)、运算符`(+,—,,/)`和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,

    相关 括号匹配

    [题目 括号匹配][Link 1] 一般的括号匹配问题是这样的: 给出一个字符串,判断这个括号匹配是不是合法的括号匹配。如”((” 和 “())”都不是合法的括号匹配

    相关 括号匹配

    栈的应用,括号匹配。 经典做法是,遇左括号压入,遇右括号判断,和栈顶配对就继续,不配对或者栈空就错了。最后判断是否为空。 代码有些麻烦。 我是遇左括号压对应的右括号,最后

    相关 括号匹配

    题目描述 假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“\[”和“\]”和花括号“\{”和“\}”,且这三种括号可按任意的次序嵌套使用(如:…\

    相关 括号匹配

    PTA 02:括号匹配 一、题目 给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,\[ \],\{ \}

    相关 括号匹配

    括号配对问题 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 3 描述 现在,有一行括号序列,请你检查这行括号是否配对。 输入 第一行