hdu_2054 (A==B?)

  以前做这道题目做不出来,现在大一暑期放假。想到好久没做 Acm 了,而且这段时间在用 java 学习 Android,发现对 C++ 有些淡忘了,于是登上学校 acm 网站找了两道题目做了下。

  这道题目还是比较复杂,考虑的情况很多,所以很容易就糊涂了。起先我也找不到很好的方法来解这道题目,后来想了想,发现用stl的栈很容易整理思路解题。

  实现思路:

      1.判断第一个字符是否为符号 '-' 或 '+' 如果是,压入栈中,如果不是,压人默认符号 '+' 。

      2.判断字符是否为 '0' 如果是直接跳过,执行下一字符。

    3.如果是 '1'~'9' 的数字,直接压入栈中,并对之后的字符不在做判断,直接入栈。

      4.如果遇到 '.' 标记 havePoint 为 true;

  5.全部入栈以后,判断 havePoint 是否为 true; 如果是判断 top() 是否返回 '0' 或 '.' ,是则弹出 pop(); 直到遇到非 '0' 或 弹出 '.' 结束;

      6.最后就是比较两个数字,通过,弹出栈顶数字比较,遇到不同就判断 NO 直到栈空 则为YES;

  

  给出几个实例如:

               0000.1   0.1000000

  则栈中分别为 +.1 和 +.1   相等;

               -00000001.1000   1.1

     则栈中分别为 -1.1 和 +1.1   不相等;

  最后还有个特殊要另行判断

      +0   -0

     栈中分别为  +   和  -  判断为不相等,但实际是相等,所以判断时先判断 size()  是否为 1 是则直接判断相等; 

附上ac代码:

#include<iostream>
#include<stack>

using namespace std;

void toObject (char* srcInteger, stack<char>& out)
{
    bool havePoint = false;
    for (int i = 0; i < strlen(srcInteger); i++)
    {
    
        if (srcInteger[i] == '-')  //判断符号
        {
            out.push('-');
            continue;
        }
        else if (srcInteger[i] != '+' && out.empty())  //默认为 '+'
        {
            out.push('+');
        }
        
        if (srcInteger[i] == '0' && out.size() == 1)  //如果栈中只有符号 且当先字符为 '0' 跳过
        {
            continue;
        }
        else
        {
            out.push(srcInteger[i]);
        }

        if (srcInteger[i] == '.')    // 如果遇到 '.' 标记havePoint 为 true
        {
            havePoint = true;
        }
    }
    if(havePoint)           // 如果栈中有 '.' 需要处理末尾数字
    {

        while(out.top() == '0')      //是 '0' 则弹出
        {
            out.pop();
        }

        if (out.top() == '.')    // 如果是 '.' 弹出并退出
        {
            out.pop();
        }
    }
}

int main()
{


    char strA[100000];
    char strB[100000];

    while(cin>>strA>>strB)
    {    
        stack<char> objectA;
        stack<char> objectB;
        
        bool equal = false;

        toObject(strA, objectA);
        toObject(strB, objectB);

        if(objectA.size() == objectB.size())   //如果长度不等无需判断
        {
            if (objectA.size() == 1)   // 处理 +0 -0 的特殊情况
            {
                equal = true;
            }
            else
            {
                while(objectA.size() > 0)
                {
                    if (objectA.top () != objectB.top() )  // 如果不等 退出循环
                    {
                        break;
                    }
                    objectA.pop();   //相等则弹出栈顶元素
                    objectB.pop();
                }
                if (objectA.size() == 0) // 最后如果栈空 则判断相等
                {
                    equal = true;
                }
            }
        }

        if (equal)
        {
            cout << "YES" << endl;
        }
        else
        {
            cout << "NO" << endl;
        }

    }


    return 0;
}

 

posted @ 2012-07-28 12:34  MonkeyDLky  阅读(604)  评论(0编辑  收藏  举报