又是一道让我心碎的题。UVA上提交了10几次都错了,在北大上又过了。用栈做的,在处理输入和判断括号上感觉还蛮良好的。
#include <stdio.h>
#include <string.h>
#define MAXN 10000
int stack[MAXN];
int topc, top, t;
bool judge() {
int sum = 0;
for (int i=1; i<=top; i++)
sum += stack[i];
if (sum == t)
return true;
return false;
}
int main() {
//freopen("f:\\out.txt", "w", stdout);
while (scanf("%d", &t) != EOF) {
int tmp = 0, flag = 0, isNeg = 0;
char pre[4];
topc = top = 0;
memset(pre, 0, sizeof (pre));
while (1) {
// 接收字符的代码,忽略掉空格和换行
char ch = getchar();
while ('\n'==ch || ' '==ch)
ch = getchar();
// 记录该字符前三个字符,便于判断是否为叶子
pre[3] = pre[2];
pre[2] = pre[1];
pre[1] = pre[0];
pre[0] = ch;
// 如果遇到左括弧就进栈
if ('(' == ch) {
topc++;
if (tmp) {
if (isNeg) {
tmp *= -1;
isNeg = 0;
}
stack[++top] = tmp;
tmp = 0;
}
continue;
}
// 如果遇到右括弧就出栈
if (')' == ch) {
// 如果为叶子便计算
if ('('==pre[1] && ')'==pre[2] && '('==pre[3]) {
if (!flag)
flag = judge();
}
else if (pre[1] != '('){
top--;
}
topc--;
// 如果左括弧都被匹配完说明二叉树输入完毕
if (!topc)
break;
continue;
}
if ('-' == ch)
isNeg = 1;
else
tmp = tmp*10 + (ch-'0');
}
if (flag)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
下面是一个牛人的代码,膜拜。忘了在哪找的了。
#include<iostream>
using namespace std;
bool ok;
bool tree_sum(int n,int sum)
{
int v;
char ch;
cin>>ch;
if(!((cin>>v)==0))
{
n+=v;
bool t=tree_sum(n,sum)|tree_sum(n,sum);
if(!ok&&!t)
ok=(n==sum);
cin>>ch;
return true;
}
else
{
cin.clear();//消除错误状态
cin>>ch;
return false;
}
}
int main()
{
// freopen("f:\\out.txt", "w", stdout);
int sum;
while(cin>>sum)
{
ok=false;
tree_sum(0,sum);
cout<<(ok?"yes":"no")<<endl;
}
return 0;
}