zoukankan      html  css  js  c++  java
  • 括号匹配的检验

    描述:

    假设一个表达式或一段程序中含有三种括号:圆括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”。试写一个程序判别给定的表达式或程序中所含括号是否正确配对出现。

    输入说明:

    多组输入数据,第1行为1个正整数n,表明有n组测试数据;其余n行为n组测试数据,每行为一个含有括号的表达式或一段程序。

    输出说明:

    对于每一组测试数据,输出一个right或wrong,表明正确匹配与否。

     

    输入样例:

    3

    a=b+(c-d)*(e-f));

    while (m<(a[8]+t) {m=m+1;  t=t-1;}

    b=a*(4+c)-c[i];

    输出样例:

    wrong

    wrong

    right

     

    括号匹配是栈(Stack)的一个经典应用

    下面是我用调用C++函数的方法完成本题的代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<string>
     4 #include<stack>     //包含栈的头文件
     5 using namespace std;
     6 int main()
     7 {
     8     int n;
     9     cin>>n;
    10     getchar();      //cin不会丢弃输入流中的换行符,getchar()函数用来接收n后面的换行符
    11     while(--n)
    12     {
    13         stack<char> s;
    14         string str;
    15         getline(cin,str);   //读取一行存放到str中,读取时会自动丢弃换行符
    16         for(int i=0;i<str.size();i++)
    17         {
    18             char st=str[i];
    19             if(st=='('||st==')'||st=='['||st==']'||st=='{'||st=='}')
    20             {
    21                 if(st=='('||st=='['||st=='{')
    22                     s.push(st);
    23                 else if(st==')')
    24                     if(s.top()=='(') s.pop();  else break;
    25                 else if(st==']')
    26                     if(s.top()=='[') s.pop();  else break;
    27                 else
    28                     if(s.top()=='{') s.pop();  else break;
    29             }
    30         }
    31         s.empty() ? cout<<"right"<<endl : cout<<"wrong"<<endl;
    32     }
    33     return 0;
    34 }

    ******

    也可以自己实现栈的功能,下面是我用C++实现的栈解决本题的代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 #define stacksize 100
     7 struct stack{
     8     char strstack[stacksize];
     9     int top;
    10 };
    11 
    12 void InitStack(stack &s){   //定义一个新栈,初始化栈顶为-1
    13     s.top=-1;
    14 }
    15 
    16 char Push(stack &s,char a){
    17     if(s.top==stacksize-1)  //判断栈是否已满,若栈满返回0,不进行入栈操作
    18         return 0;
    19     s.top++;                //栈顶指针指向下一个存储单元
    20     s.strstack[s.top]=a;    //入栈操作
    21     return a;               //返回入栈的字符
    22 }
    23 
    24 char Pop(stack &s){
    25     if(s.top==-1)           //判断栈是否为空,若为空返回0;不进行出栈操作
    26         return 0;
    27     char a=s.strstack[s.top];//栈顶元素赋给a
    28     s.top--;                //栈顶指针移向前一个存储单元
    29     return a;               //返回出栈的字符串
    30 }
    31 
    32 int Empty(stack &s){        //判断栈是否为空,栈空返回1,不空返回0
    33     if(s.top==-1)
    34         return 1;
    35     else
    36         return 0;
    37 }
    38 
    39 int Check(char* str){       //判断字符串str是否匹配
    40     stack s;                //声明一个栈
    41     InitStack(s);           //初始化栈
    42     int strn=strlen(str);
    43     for(int i=0;i<strn;i++)
    44     {
    45         char a=str[i];
    46         switch (a){
    47         case '(':
    48         case '[':
    49         case '{':
    50             Push(s,a);
    51             break;
    52         case ')':
    53             if(Pop(s)!='(')
    54                return 0;
    55             break;
    56         case  ']':
    57             if(Pop(s)!='[')
    58                return 0;
    59             break;
    60         case '}':
    61             if(Pop(s)!='{')
    62                return 0;
    63             break;
    64         }
    65     }
    66     return Empty(s);        //返回栈是否为空,返回1则说明str匹配,返回0说明不匹配
    67 }
    68 
    69 int main()
    70 {
    71     int n;
    72     cin>>n;
    73     while(n--)
    74     {
    75         char str[100];
    76         cin>>str;
    77         int re=Check(str);
    78         re==1 ? cout<<"right"<<endl : cout<<"wrong"<<endl;
    79     }
    80     return 0;
    81 }

    ******

  • 相关阅读:
    Android 开发学习进程0.19 webview 的使用
    2020年4到6月—7家公司面试总结(3家已拿offer)
    iOS今日头条第3轮面试回忆
    [搬运]Dart之枚举中使用扩展
    Proguard 常用规则
    shiro安全框架
    Android服务的AIDL跨进程(程序)操作
    Android——服务的实例,银行服务
    Android四大组件之服务————服务的生命周期和启动方式
    Android 程序间的广播和Manifest找不到(解决方法)
  • 原文地址:https://www.cnblogs.com/sage-blog/p/4026023.html
Copyright © 2011-2022 走看看