• UVA 112 Tree Summing(栈)


            又是一道让我心碎的题。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;
    }



     

  • 相关阅读:
    Text Link Ads 注册[赚钱一]
    Linux文件系统中的链接
    C++虚函数和纯虚函数(1)
    Android init reading tips
    Android上GDB的使用
    What is prelink?
    Linux fork哪些被继承,哪些不被继承
    为什么x86 Linux程序起始地址是从0x08048000开始的?
    Android应用开发的插件化 模块化
    C++拷贝构造函数(深拷贝、浅拷贝)
  • 原文地址:https://www.cnblogs.com/zcube/p/4194540.html
Copyright © 2020-2023  润新知