洛谷P1241 括号序列
题目说的模模糊糊,样例又太过简单没起作用,在猜出题人意思,阅读理解属于是
大致意思是,从左往右扫,扫到右括号时,检测其左边第一个未匹配的左括号,匹配这两就匹配了,给这两打个标记,不匹配就继续扫
读进来从左往右扫一遍,是左括号就压入栈,是右括号就检测左边第一个未匹配的左括号(其实就是栈顶),不匹配直接过,匹配就两个都打一下标记,然后出栈
比较麻烦的地方在,怎么给匹配的左括号打标记,懒得想直接用指针解决了,然后本来标记是打算简单+1的,但是 '(' + 1 好像会变成 ')'
输出时候从左往右扫一遍,不匹配的就手动匹配,匹配的直接输出就行
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 105;
char s[N];
char* q[N];
int main(){
scanf("%s", s);
int len = strlen(s);
int top = 0;
for(int i = 0; i < len; ++i){
if(s[i] == '(' || s[i] == '[') q[++top] = &s[i];
else{
if(s[i] == ')'){
if(top && *q[top] == '('){
*q[top--] -= '0';
s[i] -= '0';
}
}else if(top && *q[top] == '['){
*q[top--] -= '0';
s[i] -= '0';
}
}
}
for(int i = 0; i < len; ++i){
if(s[i] == '(' || s[i] == ')') printf("()");
else if(s[i] == '[' || s[i] == ']') printf("[]");
else printf("%c", s[i] + '0');
}
return 0;
}

浙公网安备 33010602011771号