当前位置: 代码迷 >> 综合 >> 括号匹配(栈)
  详细解决方案

括号匹配(栈)

热度:33   发布时间:2024-01-25 05:47:41.0

题目描述:

在某个字符串(长度不超过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;}
}

 

  相关解决方案