先说一件事
开学了,更新会慢很多,游戏还没调好,敬请期待
下面是正文
1203:扩号匹配问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 18876 通过数: 9815
【题目描述】
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注。
【输入】
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
【输出】
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。
【输入样例】
((ABCD(x)
)(rttyy())sss)(
【输出样例】
((ABCD(x)
$$
)(rttyy())sss)(
? ?$
没用递归,之前做过类似的题,不过老师要求用栈做,稍微改了一下,能过
#include<bits/stdc++.h>
using namespace std;
const int N=10001;
int b[N],top=0;
char a[101];
bool pop()
{
if(top>0)
{
top--;
return true;
}
else
{
return false;
}
}
bool topp()
{
if(top>0)
{
return true;
}
else
{
return false;
}
}
int popp()
{
return b[top];
}
void push(int x)
{
if(top<N-1)
{
b[++top]=x;
}
}
int main()
{
while(cin>>a)
{
cout<<a<<endl;
int len=strlen(a);
for(int i=0;i<len;i++)
{
if(a[i]=='(')
{
push(i);
a[i]=' ';
}
else if(a[i]==')')
{
if(!pop())
{
a[i]='?';
}
else
{
a[i]=' ';
}
}
else
{
a[i]=' ';
}
}
while(topp())
{
a[popp()]='$';
pop();
}
cout<<a<<endl;
}
}
3276

被折叠的 条评论
为什么被折叠?



