括号匹配并标注(栈)

只谈情不闲聊 提交于 2020-01-21 12:32:56

题目描述:

在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;

规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。

写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。

不能匹配的左括号用"$“标注,不能匹配的右括号用”?"标注.

输入:

输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
注意:cin.getline(str,100)最多只能输入99个字符!

输出:

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

 

样例输入:

)(rttyy())sss)(

样例输出:

)(rttyy())sss)(

?                ? $

 

# include<iostream>
# include<string>
# include<vector>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<map>
# include<stack>
using namespace std;

void clearStack(stack<char>& s) {
    while(!s.empty()) {
        s.pop();
    }
}
void print(stack<char> s) {
    while(!s.empty()) {
        char t = s.top();
        cout << t << " ";
        s.pop();
    }
}


int main() {

    /*
    括号匹配 思想:
    str存放: )(rttyy())sss)(
    res存放结果

    遍历str
    如果str是非(),res += ''
    如果str是(,入栈
    如果str是),
     栈空:说明匹配不上 res+='?';
     栈不空:里面全是'(', 说明匹配上了  s.pop; res+=' ';


     这个题目有点问题:他不会找到完全不匹配的内容
     如果:   fdafda((((()
        他会              $
        而不是      ????   $
    */


    stack<char> s;
    string str;
    string res;
    while(cin >> str) {

        // 清空栈
        clearStack(s);
        res = "";

        for (int i = 0; i <= str.size() - 1 ; i++) {
            if (str[i] != '(' && str[i] != ')') {
                res += ' ';
            } else if (str[i] == '(') {
                s.push(str[i]);
                res += ' ';
            } else if (str[i] = ')') {
                if (s.empty()) {
                    res += '?';
                } else {
                    res += ' ';
                    s.pop();
                }
            }
        }

        if (!s.empty()) {
            res += '$';
        }
        cout << res << endl;

    }
}



 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!