UVA112二叉树之使用标记忽略空格和回车
2015-08-25 10:46
387 查看
对于空格和回车使用标记来判断,主要分为左括号,右括号,和数字的状态,
左括号的时候,判断之前是否为读数状态,如果为读数状态,如果栈为空,
则数字为前面那个数字的左节点或者右节点,同时标记一个re,每次入栈时加上栈的
值,为数字时加入数字数组,为右括号时,判断之前是否为左括号的读入状态,同样是用
标记来判断,如果是,如果栈为空则为空括号,直接可以跳出,如果栈非空,则栈顶元素的
做节点或者右节点为空。如果左右节点都为空,则为叶子节点,则可判断是否符合,
如果碰到右节点且栈不是空括号,则出栈,并用re减去那个值,这个地方的处理比较耐人寻味,
自己琢磨。这个思路就是分析所有的输入状态,比较繁琐。但是比较容易想到。
左括号的时候,判断之前是否为读数状态,如果为读数状态,如果栈为空,
则数字为前面那个数字的左节点或者右节点,同时标记一个re,每次入栈时加上栈的
值,为数字时加入数字数组,为右括号时,判断之前是否为左括号的读入状态,同样是用
标记来判断,如果是,如果栈为空则为空括号,直接可以跳出,如果栈非空,则栈顶元素的
做节点或者右节点为空。如果左右节点都为空,则为叶子节点,则可判断是否符合,
如果碰到右节点且栈不是空括号,则出栈,并用re减去那个值,这个地方的处理比较耐人寻味,
自己琢磨。这个思路就是分析所有的输入状态,比较繁琐。但是比较容易想到。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<string> #include<cctype> #include<cmath> #include<map> #include<set> #include<vector> #include<queue> #include<stack> #include<ctime> #include<algorithm> #define LL long long using namespace std; const int maxn=1e3+10; struct node { int data; int left,right; int lv; int lnull; }; int main() { int i; while(cin>>i) { char ch; int cnt=0; int dsz=0; int zkh=0; int x=0; char num[15]; node anode[maxn]; int fg=0; int re=0; int flag=0; stack<int> v; while((ch=getchar())) { if(ch=='(') { if(dsz) { num[x]='\0'; int bnum=atoi(num); x=0; anode[++cnt].data=bnum; anode[cnt].left=0; anode[cnt].right=0; anode[cnt].lv=0; anode[cnt].lnull=0; re+=bnum; fg=1; if(!v.empty()) { if(!anode[v.top()].lv) {anode[v.top()].left=cnt;anode[v.top()].lv=1;} else anode[v.top()].right=cnt; } v.push(cnt); } dsz=0; zkh=1; } else if(ch=='-'||isdigit(ch)) { num[x++]=ch; dsz=1; zkh=0; } else if(ch==')') { if(zkh) { if(!v.empty()) { if(anode[v.top()].lv==0) { anode[v.top()].lv=1; anode[v.top()].lnull=1; } else { if(anode[v.top()].lnull&&re==i) {flag=1;} } } else { fg=1; } } else { re-=anode[v.top()].data; v.pop(); } dsz=0; zkh=0; } if(fg&&v.empty()) break; } cout<<(flag?"yes":"no")<<endl; } 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; }
相关文章推荐
- Linux cmake 入门使用
- SQL中的循环、for循环、游标
- HDU 2068 RPG的错排(错排+排列组合)
- Linux下Jenkins的安装及配置
- HTML5来了:推荐5个好用的混合式App开发工具
- android 应用内存优化之OnLowMemory&OnTrimMemory
- Ubuntu14.04下基于MPICH2框架的集群搭建
- hdu1730 尼姆博弈
- 快速幂
- Java中Stringbuffer、Arrays、Interger、Character类的特性
- MFC程序崩溃的友好处理
- c++ int转string int转wstring
- 提升网站用户体验的几个建议
- axis2开发webservice入门到精通
- UIImage与NSData间的转换
- 调测工具VcTester攻略--搭建运行环境
- 【DP】 HDOJ 5410 CRB and His Birthday
- android学习笔记之通过java源码设置EditText不可编辑状态
- HDU 3874 Necklace(树状数组的离线操作)
- 利用set过滤list里的重复元素2015-8-25