题目链接:http://ac.jobdu.com/problem.php?pid=1153
详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus
2017年07月27日22:25:45 郑鹏飞
这里的括号匹配问题类似之前的常规问题。但是要求输出不匹配的括号的标记,同时结果不仅输出不匹配位置还要输出原来的字符串!
因此为了标记不匹配的括号,同时为了区分左括号与右括号不匹配时的输出结果不相同,需要分别对其进行判断。
因此需要判断每一个左括号是否有对应的右括号。
如果左括号有相应匹配的右括号。那么就标记这两个位置的括号都是匹配的,可以设置为1。默认当前位置的括号都是不匹配的也就是0.
此外,其他部分均与常规括号匹配一致,使用栈进行操作。
左括号入栈(这里入栈的是左括号所在输入字符串的下标)
遇到右括号,看栈是否为空,如果不为空,那么栈顶出栈。并且设置出站的下标对应的左括号是匹配的,设置相应的右括号的下标也是匹配的。
因此需要栈保存下标
需要数组保存对应下标括号是否匹配。
最终输出时,进行遍历。当前位置为左括号并且不匹配则输出$,匹配则输出" " 即一个空格
当前位置为右括号并且不匹配则输出?,匹配则输出" " 即一个空格
遇到其他的不是括号的字符,全部输出" " 即一个空格。
至此完成代码。
// // 1153 括号匹配问题.cpp // Jobdu // // Created by PengFei_Zheng on 08/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <stack> using namespace std; stack<int> l; char s[110]; int main(){ while(scanf("%s",s)!=EOF){ int len = (int)strlen(s); int flag[len]; memset(flag,0,sizeof(flag)); while(!l.empty()) l.pop(); for(int i = 0 ; i < len ; i++){ if(s[i]=='(') l.push(i); else if(s[i]==')' && !l.empty()){ int temp = l.top(); l.pop(); flag[i]=1; flag[temp]=1; } } printf("%s ",s); for(int i = 0 ; i < len ; i++){ if(s[i]=='('){ if(flag[i]!=1) printf("$"); else printf(" "); } else if(s[i]==')'){ if(flag[i]!=1) printf("?"); else printf(" "); } else{ printf(" "); } } printf(" "); } return 0; } /************************************************************** Problem: 1153 User: zpfbuaa Language: C++ Result: Accepted Time:0 ms Memory:1524 kb ****************************************************************/