18933 括号匹配问题

Description

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

输入格式

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

输出格式

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

输入样例

((ABCD(x)
)(rttyy())sss)(

输出样例

((ABCD(x)
$$
)(rttyy())sss)(
? ?$

提示

读取多组数据时,可采用如下方法,其他scanf读到文件尾时会返回值EOF。
char s[205];
while(scanf("%s",s)!=EOF){}

代码实现

#include<iostream>
#include<stdio.h>
#include<stack>

using namespace std;
#define MAXN 102

int main() {

    stack<int> S;//左括号位置栈
    char str[MAXN];//原字符
    while (gets(str)) {
        int i;

        char ans[MAXN]={0};//结果(需要清0)
        for (i = 0; str[i] != 0; i++) {
            if (str[i] == '(') {
                S.push(i);
                ans[i] = ' ';
            }
            else if (str[i] == ')') {
                if (!S.empty()) {
                    S.pop();
                    ans[i] = ' ';//右括号匹配成功
                } else {
                    ans[i] = '?';//右括号匹配不成功(多了)
                }
            }
            else {//既不是左括号,也不是右括号
                ans[i] = ' ';
            }
        }
        while (!S.empty()) {
            ans[S.top()] = '$';
            S.pop();
        }
        cout << str <<endl;
        cout << ans <<endl;

    }
    return 0;
}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐