zoukankan      html  css  js  c++  java
  • 堆栈入门-括号匹配问题

    堆栈入门-括号匹配问题

    时间限制:1 秒   内存限制:32 兆

    题目描述: 

    在某个字符串(长度不超过 100)中有左括号、右括号和大小写字母;规定 (与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的 右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串, 并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括 号用"?"标注. 

    输入:

    输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大 小写字母,字符串长度不超过 100。

    输出:

    对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?" 和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。

    样例输入:

    )(rttyy())sss)(

    样例输出:

    )(rttyy())sss)( 
    ?          ?$ 

    解题思路:

    括号匹配问题是堆栈的一个典型应用。由于每一个右括号,必定是与在其之前的所有未被匹配的左括号中最靠右的一个匹配。若我们按照从左至右的顺序遍历字符串,并将遇到的所有左括号都放入堆栈中等待匹配;若在遍历过程中遇到一个右括号,由于按照从左向右的顺序遍历字符串,若此时堆栈非空,那么栈顶左括号即为与其匹配的左括号;相反,若堆栈为空,则表示在其之前不存在未被匹配的左括号,匹配失败。

    注意事项:

    有一个很有趣的事情,char a[105]如果定义为全局变量会自动初始化,在结尾加上''。但是如果定义在main函数中,则不会初始化,如果整体输出结尾会输出一系列“烫”,需要手动初始化,比如写为char a[105] = {0}

    参考代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<stack>
    using namespace std;
    
    stack<int> t;
    char s[105];
    char a[105];//答案
    
    int main()
    {
        while (scanf("%s", s) != EOF)
        {
            while (!t.empty())t.pop();
            int l = strlen(s);
            for (int i = 0; i < l; i++)
            {
                if (s[i] == '(') t.push(i);
                else if (s[i] == ')')
                {
                    if (t.empty())a[i] = '?';
                    else
                    {
                        int id = t.top();
                        a[id] = ' ';
                        t.pop();
                        a[i] = ' ';;
                    }
                }
                else a[i] = ' ';
            }
            if (!t.empty())
            {
                int idx = t.top();
                a[idx] = '$';
                t.pop();
            }
            printf("%s
    ", a);
        }
        system("pause");
        return 0;
    }
    #include<cstdio>
    #include<cstring>
    #include<stack>
    using namespace std;
    
    int main()
    {
        char s[105];
        scanf("%s",s);
        stack<int> q;
        int l = strlen(s);
        for(int i=0;i<l;i++)
        {
            if(s[i]=='(')q.push(i);
            else if(s[i]==')')
            {
                if(!q.empty())
                {
                    int x = q.top();
                    q.pop();
                    s[i]=' ';s[x]=' ';
                }
                else s[i]='?';
            }
            else s[i]=' ';
        }
        while(!q.empty())
        {
            int x = q.top();
            q.pop();
            s[x]='$';
        }
        printf("%s
    ",s);
        return 0;
    }
    二刷
  • 相关阅读:
    SpringMVC ModelAndView方法与模板传参接收不到问题
    DB2单个DB重启
    DB2 数据库绑定用户授权命令
    [转]sublime配置全攻略
    [转]Sublime text2安装php beautifier
    [转]php及xdebug使用小结
    [转]Pear、PHPUnit安装
    [转]WIN下成功安装PEAR
    [转]PHP单元测试利器:PHPUNIT初探
    [转]sublime使用xdebug调试php
  • 原文地址:https://www.cnblogs.com/yun-an/p/11067112.html
Copyright © 2011-2022 走看看