文章

20

粉丝

224

获赞

56

访问

137.4k

头像
将没办法配对的括号的下标存储下来就好了,剩下的字符都是空格
P1296 北京大学机试题
发布于2022年2月3日 20:24
阅读数 5.9k

#include<iostream>
#include<cstring>
#include<stack>
using namespace std;

int main() {
	char s[256];
	while (scanf("%s", s) != EOF) {
		int len = strlen(s);
		stack<char> st;
		stack<int> st_index; // 存储栈 st 中的元素对应字符串 s 中的下标
		for (int i = 0; i < len; ++i) {
			if (s[i] != '(' && s[i] != ')') continue;
			else {
				if (!st.empty()) {
					char now = st.top();
					// 进行括号配对判断,配对成功则出栈,否则进栈
					if (now == '(' && s[i] == ')') {
						st.pop();
						st_index.pop();
					}
					else {
						st.push(s[i]);
						st_index.push(i);
					}
				} else {
					st.push(s[i]);
					st_index.push(i);
				}
			}
		}
		cout << s << endl;
		// 最后 st 中留下的括号则是没办法进行配对的括号,对应在 s 中的下标则存储在 st_index 中
		// 通过将 s 中没办法配对的括号换成对应的 $ 或 ? ,再把其他字符换成空格即可
		for (int i = len - 1; i >= 0; --i) {
			if (!st_index.empty()) {
				if (i == st_index.top()) {
					if (s[i] == '(') s[i] = '$';
					else s[i] = '?';
			...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发