您的位置:首页 > 其它

hdu_2054 (A==B?)

2012-07-28 12:34 302 查看
  以前做这道题目做不出来,现在大一暑期放假。想到好久没做 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: