poj 1145 Tree Summing 栈+模拟

题意:

给一个数a和一棵带权树T,判断T根到叶子的若干路径的权和中是否有和a相等的。

分析:

       栈用来表达式求值有两种办法,一是将表达式转为后序再求值,二是利用单调符号栈一次扫描。单调符号栈一次扫描法求值时维护单调符号栈(栈中总是优先级低的符号在下,‘(’在栈外优先级最高,栈中优先级最低,‘)’在栈外优先级最低,不可能出现在栈中)。先搞清楚表达式求值的单调符号栈一次扫描法这题就容易了,在这题中用栈模拟树的前序遍历。

代码:

//poj 1145
//sep9
#include <iostream>
#include <stack>
using namespace std;

bool isChar(char ch)
{
	return ch=='('||ch==')'||(ch>='0'&&ch<='9')||ch=='-'; 
}

int main()
{
	int tot;
	char ch;
	while(scanf("%d",&tot)==1){
		stack<int> nums,states;
		int cnt=0,cur=0;
		bool read_enable=true;
		bool find=false;
		bool flag=false;
		while(1){
			if(read_enable)
				while((ch=getchar())&&!isChar(ch));
			if(ch=='('){
				++cnt;
				read_enable=true;
				continue;
			}
			if(ch==')'){
				--cnt;
				if(!states.empty())
					++states.top();
				if(!states.empty()&&states.top()==3){
					if(flag&&cur==tot) find=true;
					flag=false;
					cur-=nums.top();
					nums.pop();
					states.pop();
					if(!states.empty())
						++states.top();
				}
				if(cnt==0)
					break;	
				read_enable=true;
				continue;
			}
			int neg=1;
			if(ch=='-'){
				ch=getchar();
				neg=-1;
			}	
			int tmp=0;
			do{
				int a=ch-'0';
			    tmp=10*tmp+a;    
			}while((ch=getchar())&&ch>='0'&&ch<='9');
			tmp*=neg;
			cur+=tmp;
			flag=true;
			nums.push(tmp);
			states.push(0);
			if(ch=='(')
				read_enable=false;
			else
				read_enable=true;
		}
		printf("%s\n",find?"yes":"no");
	}
	return 0;	
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值