您的位置:首页 > 其它

UVA_112_Tree Summing

2016-04-06 18:24 323 查看
#include<iostream>
#include<sstream>
#include<vector>
#include<string>
#include<stack>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;
using std::stringstream;
using std::stack;
const int MAX = 2147483647;
typedef struct NodeType
{
int value;
NodeType *pre = nullptr;
NodeType *next = nullptr;
bool flag = true;
}NodeType, *Node;
int result(Node p)
{
if (p)
{
return p->value + result(p->pre);
}
else
{
return 0;
}
}
bool judge(stack<Node>&leaf, const int &sum)
{
while (!leaf.empty())
{
auto p = leaf.top(); leaf.pop();
if (sum == result(p))
{
return true;
}
}
return false;
}
void scan(stack<Node>&leaf)
{
stack<char>bracket;
stack<Node>value;
char ch;
int result = MAX;
int sign = 1;
input:    while (cin >> ch)
{
if (ch == '-')
{
sign = -1;
}
else if (ch == '(' || ch == ')')
{
if (ch == '(')
{
if (!value.empty())
{
if (result != MAX)
{
//value.emplace(nullptr,result,value.top(),true);
auto p = new NodeType;
p->value = result;
p->pre = value.top();
p->next = nullptr;
p->flag = true;
value.top()->next = p;
value.push(p);
result = MAX;
sign = 1;
}
}
else
{
if (result != MAX)
{
auto p = new NodeType;
p->value = result;
p->pre = nullptr;
p->next = nullptr;
p->flag = true;
value.push(p);
result = MAX;
sign = 1;
}
}
bracket.push(ch);
}
else
{
bracket.pop();
if (bracket.empty() && value.empty())
{
break;
}
if (value.top()->flag)
{
value.top()->flag = false;
}
else
{
if (!value.top()->next)
{
leaf.push(value.top());
}
value.pop();
}
}
}
//如果是数字
else
{
if (result == MAX)
{
result = 0;
}
result *= 10;
if (sign > 0)
{
result += ch - '0';
}
else
{
result -= ch - '0';
}
}
}
}
void print(stack<Node>&leaf, const int &sum)
{
if (judge(leaf, sum))
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int sum;
while (cin >> sum)
{
stack<Node> leaf;
scan(leaf);
print(leaf, sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: