• PTA 7-2 符号配对(栈模拟)


    请编写程序检查C语言源程序中下列符号是否配对:/**/()[]{}

    输入格式:

    输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。

    输出格式:

    首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?

    输入样例1:

    void test()
    {
        int i, A[10];
        for (i=0; i<10; i++) /*/
            A[i] = i;
    }
    .
    

    输出样例1:

    NO
    /*-?
    

    输入样例2:

    void test()
    {
        int i, A[10];
        for (i=0; i<10; i++) /**/
            A[i] = i;
    }]
    .
    

    输出样例2:

    NO
    ?-]
    

    输入样例3:

    void test()
    {
        int i
        double A[10];
        for (i=0; i<10; i++) /**/
            A[i] = 0.1*i;
    }
    .
    

    输出样例3:

    YES

    题意

    如上

    题解

    这里用栈存符号,遇到右括号判断栈顶元素是否为对应的左括号,详细看代码

    这里给几个特殊样例

    1./*

    2./**/*/

    代码

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 stack<char> sc;
     5 int flag=1;
     6 int check(char ch)
     7 {
     8     if(!sc.empty())
     9     {
    10         char uh=sc.top();
    11         if(uh=='('&&ch==')')sc.pop();
    12         else if(uh=='['&&ch==']')sc.pop();
    13         else if(uh=='{'&&ch=='}')sc.pop();
    14         else if(uh=='*'&&ch=='*')sc.pop();
    15         else
    16         {
    17             printf("NO
    ");
    18             if(uh=='(')printf("(");
    19             if(uh=='[')printf("[");
    20             if(uh=='{')printf("{");
    21             if(uh=='*')printf("/*");
    22             printf("-?
    ");//少右
    23             flag=0;
    24         }
    25     }
    26     else
    27     {
    28         printf("NO
    ");
    29         printf("?-");//少左
    30         if(ch==')')printf(")");
    31         if(ch==']')printf("]");
    32         if(ch=='}')printf("}");
    33         if(ch=='*')printf("*/");
    34         flag=0;
    35     }
    36 }
    37 int main()
    38 {
    39     char a[1000];
    40     for(;;)
    41     {
    42         gets(a+1);
    43         if(a[1]=='.')break;
    44         if(flag==0)continue;
    45         for(int i=1;a[i];i++)
    46         {
    47             char ch=a[i],nh=a[i+1];//ch当前,nh下一个
    48             if(ch=='('||ch=='['||ch=='{')//
    49                 sc.push(ch);
    50             else if(ch=='/'&&nh=='*')//这里特判下/*的情况
    51                 sc.push('*'),i++;
    52             else if(ch==')'||ch==']'||ch=='}'||ch=='*'&&nh=='/')//
    53             {
    54                 if(ch=='*'&&nh=='/')i++;//这里特判下*/的情况
    55                 check(ch);
    56             }
    57             if(flag==0)break;//如果不行直接跳出
    58         }
    59     }
    60     if(!sc.empty()&&flag)check(' ');//判断只有1个符号的情况
    61     if(flag)printf("YES
    ");
    62     return 0;
    63 }
  • 相关阅读:
    面试题
    iOS 对overflow:scroll使用
    iOS微信页面 长按图片出现【存储图像】和【拷贝】不出现【发送朋友】【保存图片】
    cookie设置和读取以及获取超链接参数
    学习资源链接
    gulp中文乱码问题
    原生ajax基础知识笔记
    Visual Studio Code 插件推荐
    前端开发中一些容易混淆的概念汇总
    jq中的类样式操作与html5中的类样式操作的对比
  • 原文地址:https://www.cnblogs.com/taozi1115402474/p/8546762.html
Copyright © 2020-2023  润新知