POJ_1100 Dreisam Equations 求指点~

链接: POJ_1100

Sample Input

18 = 7 (5 3) 2
30 = 3 3 5
18 = 3 3 5
5 = 3 3
0

Sample Output

Equation #1:
18=7+(5-3)*2

Equation #2:
30=3+3*5

Equation #3:
Impossible

Equation #4:
Impossible
对于这道题,我的基本思想是:整行读取,将等号左边的数用变量left保存下来,用于比较。右边采取栈的方式,申明两个栈,stack num 和stack bracket,num用于存储右边的数字(不在括号中的),bracket用于存储括号中的数字,将bracket中的数用递归的方法算出所有可能结果,保存在一个数组中,再将结果逐一推到栈num中,继续读取数字,遇到括号则先计算括号里的可能值。额,那个,貌似挺复杂的,然后我就卡那儿了~不知道各位大侠觉得这办法怎么样?我越来越觉得不太可行了~还请各位多多指教~下面是我未能完成的代码:
 
#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <stack>

using namespace std;
int num=0;//用于计算测试数据的组数

int calculate(vector<char> v,int i,int j){//想计算栈中所有可能值,原打算用递归,但,没写出来
	stack<int> num;
	stack<int> bracket;
	while(i!=j){//将数字和括号内的数字分别入栈num和bracket。
		if(v[j]!=')'){
			num.push(v[j]-'0');
			j--;}
	else if(v[j]==')'){
			j--;
			if(v[j]!=')'&&v[j]!='(')
			{bracket.push(v[j]-'0');
			j--;}
	}
	else if(v[j]=='('){
		int answer;
		int f=0;
		while(bracket.empty()){//求一个栈的元素的所有可能结果,这儿卡住了,不知道怎么做了。
			int m=bracket.top();
			bracket.pop();
			int n=bracket.top();
			bracket.pop();
			if(f=0){
				bracket.push(m+n);
				f=1;
			}else if(f=1){
				bracket.push(m*n);
				f=2;
			}else if(f=2){
				bracket.push(m-n);
				answer=bracket.top();
				bracket.pop();
			}	
		}
		}
	}
return 0;
}

void match(char data[]){
	num++;
	int left=0;
	int i=0;
	while(data[i]!=' '){//left
		left+=data[i]-'0';	
		if(data[i+1]!=' ')
			left*=10;
			i++;
		}
	vector<char> v;
	while(data[i]){//将等号右边的括号和数据推入栈中
		if(data[i]!=' '&&data[i]!='=')
			v.push_back(data[i]);
		i++;
	}

/*	vector<char>::const_iterator j;
	for(j=v.begin ();j!=v.end();j++)
		cout<<*j;
*/
	int n=v.end()-v.begin();
		//cout<<n;
	calculate(v,0,n-1);//调用calculate函数想计算栈中数据的所有可能值。
}

int main(){
	if(freopen("intput.in","r",stdin)==0||freopen("output.out","w",stdout)==0){//采用文件的方式读取数据
		cout<<"failed to open files"<<endl;
		return 1;
	}else
	{
		char data[1000] ;
		 for(int j=0;j<80;j++){ 
			 cin.getline(data,1000,'\n'); //整行读取
			 if(data[0]=='0')	 break;
			 match(data); 
		 }	 
	}
fclose(stdin);
fclose(stdout);
return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值