//这道题困扰了我很久,老师上课打过一次代码,我记不全了,就靠记住的那一点小片段,然后不停地补充。
//首先,字符数组c是我要输入的,然后字符数组ans初始化为空格,再定义一个整形数组s(数组s用于记录左括号的位置)【在定义变量时要养成一个初始化的习惯,有的时候会因此发生错误哦】这道题用了栈来解决。当读到一个左括号“(”时,就入栈,top指针加一;如果读到了右括号“)”,先判断top指针是否为0,如果top==0,说明该右括号前没有左括号,那么数组ans就在该右括号的位置上存一个“?”,如果top不等于0,说明这个栈里面有左括号,那么他们就是匹配的,则把栈中的左括号拿出来,一直循环。当输入完后,我们就需要检查栈里还有没有左括号(这个栈只存了左括号),如何检查?看top是否等于0就好了。在栈中查找元素时,top指针要先自减一,循环条件为top>=0,数组s里存的是左括号的位置(也就是左括号在字符数组c中的下标),当top>=0时说明还有未匹配的左括号,根据数组s中存的位置(即下标),用ans数组存上一个“$”。到这里,括号匹配已经完成,未匹配的已经做上了标记,最后一步就是遍历数组ans。
//下面是全部代码
另:for(c;cin>>c;)和while(cin>>c)和while(scanf("%s",c)!=EOF)都是读入多组数据的方法,用哪个都可以
然后这道题在我试了多组样例后均能得出正确结果,但是oj上过不了!!!为什么!!因为我少输出了!!!仔细看oj上的输出样例,输入字符串后还应该再输出一次原字符串!就是这个问题,我找了好久都没想到!所以做题的时候一定要仔细看输出要求!
#include <iostream>
#include <malloc.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define OK 1
#define ERROR 0
using namespace std;
char c[100];
int main()
{
//for(c;cin >>c;)
//while(cin >> c)
while(scanf("%s",c)!=EOF)//读多组数据
{
cout << c << endl;//划重点!仔细看输出样例!在输入字符串后还要再输出一次字符串!
int s[100];
char ans[100]={' '};
int i,top=0,n;
n=strlen(c);//长度
for(i=0;i<n;i++)
{
if(c[i]=='(')//遇到左括号
{
s[top++]=i;//把左括号的位置写进数组s
}
else if(c[i]==')')//遇到右括号
{
if(top==0)//如果栈顶指针为0,说明这个右括号不匹配
ans[i]='?';//数组ans存一个问号
else
top--;//否则,它有匹配的左括号,将左括号出栈
}
}
top=top-1;//栈顶指针先减一
while(top>=0)
{
int x=s[top];//数组s存的是不匹配的左括号的位置
ans[x]='$';//不匹配的左括号的位置上存一个$
top--;//栈顶指针减一
}
//printf("%s\n",c);
for(i=0;i<n;i++)
{
if(ans[i])
cout<<ans[i];
else
cout<<' ';
}
printf("\n");
}
return 0;
}