Particle

競技プログラミングについての雑記

AOJ 0109: Smart Calculator

実装するだけですが、こういうの(構文解析?)に慣れてないから、実装が結構難しかったです。
整数が1桁だと思い込んでいるとWAします。

#include <iostream>
#include <string>
using namespace std;

string s;

int single(int& pos);

int figure(int& pos);

int solve(int& pos);

int main(){
	int T;
	cin>>T;
	for(int i = 0; i < T; i++){
		cin>>s;
		int pos = 0;
		cout<<solve(pos)<<endl;
	}
	
	return 0;
}

int single(int& pos){//数値を返したりする関数
	if(s[pos]!='('){
		int res = 0;
		while('0'<=s[pos] && s[pos]<='9'){
			res *= 10;
			res += s[pos]-48;
			pos++;
		}
		return res;
	}else{
		return solve(++pos);
	}
}

int figure(int& pos){//掛け算・割り算をする関数
	int res = single(pos);
	while(1){
		if(s[pos]=='*'){
			res *= single(++pos);
		}else if(s[pos]=='/'){
			res /= single(++pos);
		}else {
			return res;
		}
	}
}

int solve(int& pos){//式全体を計算する関数(カッコ内の計算も一つの式とみなす)
	int res = figure(pos);
	while(s[pos]!='=' && s[pos]!=')'){
		if(s[pos]=='+') res += figure(++pos);
		else if(s[pos]=='-') res -= figure(++pos);
	}
	pos++;
	return res;
}