import java.io.*;
import java.util.*;
import java.lang.*;
final class Expr {
private final static long LONG_MIN
= Long.
MIN_VALUE / 10L
; private final static long LONG_MAX
= Long.
MAX_VALUE / 10L
;
s = s.replaceAll("\\s+", ""); // удалим пробелы, '\n', '\t'...
if(s.length() == 0)
if(! is_rules(s))
int[] index = {0};
return SubExpr(s, index);
}
private static long SubExpr
(String s,
int[] index
){ boolean neg, loop;
long val, num;
Stack<Character> sops = new Stack<Character>();
Stack<Long> sval = new Stack<Long>();
neg = false;
loop = true;
for(int i = index[0]; i < s.length(); ){
switch(s.charAt(i)){
case '+':
case '/':
case '*':
sops.push(s.charAt(i));
++i;
break;
case '-':
if((i == 0) || ((i > 0) && is_math(s.charAt(i - 1)))){
neg = true;
++i;
break;
}
sops.push(s.charAt(i));
++i;
break;
case '(':
index[0] = i + 1;
val = SubExpr(s, index);
i = index[0];
if(neg)
val = 0L - val;
neg = false;
sval.push(val);
calc_muldiv(sval, sops);
break;
case ')':
index[0] = i + 1;
loop = false;
break;
default:
index[0] = i;
val = ToLong(s, index);
i = index[0];
if(neg)
val = 0L - val;
neg = false;
sval.push(val);
calc_muldiv(sval, sops);
break;
}
if(! loop)
break;
}
if(sval.size() == 0)
num = sval.get(0);
sval.remove(0);
for(int i = 0; (i < sops.size()) && (i < sval.size()); ++i){
switch(sops.get(i)){
case '+':
num += sval.get(i);
break;
case '-':
num -= sval.get(i);
break;
}
}
sops.clear();
sval.clear();
sops = null;
sval = null;
return num;
}
//приоритетные операции: умножение, деление
private static void calc_muldiv(Stack<Long> sval, Stack<Character> sops){
long val;
char ch;
while(! sops.isEmpty()){
ch = sops.peek();
if((ch == '+') || (ch == '-'))
break;
val = sval.peek();
sval.pop();
if(sval.size() == 0)
if(ch == '*')
sval.set(sval.size() - 1, sval.peek() * val);
else if(ch == '/'){
if(val == 0L)
sval.set(sval.size() - 1, sval.peek() / val);
}
sops.pop();
}
}
// конвертирование числа из строки
private static long ToLong
(String s,
int[] index
){ long n = 0L;
int i;
for(i = index[0]; i < s.length(); ++i){
if(n > LONG_MAX || n < LONG_MIN)
n = n * 10L + (long) (s.charAt(i) - '0');
} else
break;
}
index[0] = i;
return n;
}
//проверка правильности расстановки скобочных выражений
private static boolean is_rules
(String s
){ int n = 0;
for(int i = 0; i < s.length(); ++i){
if(s.charAt(i) == '(')
++n;
else if(s.charAt(i) == ')')
--n;
}
return (n == 0);
}
private static boolean is_math(char ch){
return (ch == '+' || ch == '-' ||
ch == '*' || ch == '/' || ch == '(');
}
}
class Project {
public static void main
(String[] args
) { String s
= "-1-(-7*-7-(-(-(-(10-2)/2*3+1)/4)+2)+2/(1+(-(-2)+3+(-4))+5))/10"; long jvm = -1-(-7*-7-(-(-(-(10-2)/2*3+1)/4)+2)+2/(1+(-(-2)+3+(-4))+5))/10;
try {
long res = Expr.Calc(s);
System.
out.
println("парсер: " + res
); System.
out.
println("static: " + jvm
); System.
err.
println(e.
getMessage()); }
}
}
aW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CgoKZmluYWwgY2xhc3MgRXhwciB7CiAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIExPTkdfTUlOID0gTG9uZy5NSU5fVkFMVUUgLyAxMEw7CiAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIExPTkdfTUFYID0gTG9uZy5NQVhfVkFMVUUgLyAxMEw7CgogICAgcHVibGljIHN0YXRpYyBsb25nIENhbGMoU3RyaW5nIHMpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIHMgPSBzLnJlcGxhY2VBbGwoIlxccysiLCAiIik7IC8vINGD0LTQsNC70LjQvCDQv9GA0L7QsdC10LvRiywgJ1xuJywgJ1x0Jy4uLgoKICAgICAgICBpZihzLmxlbmd0aCgpID09IDApCiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oItCh0YLRgNC+0LrQsCDQv9GD0YHRgtCwISIpOwogICAgICAgIGlmKCEgaXNfcnVsZXMocykpCiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oItCe0YjQuNCx0LrQsCDQsiDRgNCw0YHRgdGC0L7QvdC+0LLQutC4INGB0LrQvtCx0L7QuiEiKTsKCiAgICAgICAgaW50W10gaW5kZXggPSB7MH07CiAgICAgICAgcmV0dXJuIFN1YkV4cHIocywgaW5kZXgpOwogICAgfQoKCiAgICBwcml2YXRlIHN0YXRpYyBsb25nIFN1YkV4cHIoU3RyaW5nIHMsIGludFtdIGluZGV4KXsKICAgICAgICBib29sZWFuIG5lZywgbG9vcDsKICAgICAgICBsb25nICAgIHZhbCwgbnVtOwogICAgICAgIFN0YWNrPENoYXJhY3Rlcj4gc29wcyA9IG5ldyBTdGFjazxDaGFyYWN0ZXI+KCk7CiAgICAgICAgU3RhY2s8TG9uZz4gICAgICBzdmFsID0gbmV3IFN0YWNrPExvbmc+KCk7CgogICAgICAgIG5lZyAgPSBmYWxzZTsKICAgICAgICBsb29wID0gdHJ1ZTsKCiAgICAgICAgZm9yKGludCBpID0gaW5kZXhbMF07IGkgPCBzLmxlbmd0aCgpOyApewoKICAgICAgICAgICAgc3dpdGNoKHMuY2hhckF0KGkpKXsKICAgICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgIGNhc2UgJy8nOgogICAgICAgICAgICBjYXNlICcqJzoKICAgICAgICAgICAgICAgIHNvcHMucHVzaChzLmNoYXJBdChpKSk7CiAgICAgICAgICAgICAgICArK2k7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnLSc6CgogICAgICAgICAgICAgICAgaWYoKGkgPT0gMCkgfHwgKChpID4gMCkgJiYgaXNfbWF0aChzLmNoYXJBdChpIC0gMSkpKSl7CiAgICAgICAgICAgICAgICAgICAgbmVnID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICArK2k7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzb3BzLnB1c2gocy5jaGFyQXQoaSkpOwogICAgICAgICAgICAgICAgKytpOwoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICcoJzoKCiAgICAgICAgICAgICAgICBpbmRleFswXSA9IGkgKyAxOwogICAgICAgICAgICAgICAgdmFsICAgICAgPSBTdWJFeHByKHMsIGluZGV4KTsKICAgICAgICAgICAgICAgIGkgICAgICAgID0gaW5kZXhbMF07CgogICAgICAgICAgICAgICAgaWYobmVnKQogICAgICAgICAgICAgICAgICAgIHZhbCA9IDBMIC0gdmFsOwogICAgICAgICAgICAgICAgbmVnID0gZmFsc2U7CgogICAgICAgICAgICAgICAgc3ZhbC5wdXNoKHZhbCk7CiAgICAgICAgICAgICAgICBjYWxjX211bGRpdihzdmFsLCBzb3BzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICcpJzoKICAgICAgICAgICAgICAgIGluZGV4WzBdID0gaSArIDE7CiAgICAgICAgICAgICAgICBsb29wICAgICA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CgogICAgICAgICAgICAgICAgaWYoISBDaGFyYWN0ZXIuaXNEaWdpdChzLmNoYXJBdChpKSkpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigi0J3QtdC40LfQstC10YHRgtC90YvQuSDRgdC40LzQstC+0LshIik7CgogICAgICAgICAgICAgICAgaW5kZXhbMF0gPSBpOwogICAgICAgICAgICAgICAgdmFsICAgICAgPSBUb0xvbmcocywgaW5kZXgpOwogICAgICAgICAgICAgICAgaSAgICAgICAgPSBpbmRleFswXTsKCiAgICAgICAgICAgICAgICBpZihuZWcpCiAgICAgICAgICAgICAgICAgICAgdmFsID0gMEwgLSB2YWw7CiAgICAgICAgICAgICAgICBuZWcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICBzdmFsLnB1c2godmFsKTsKICAgICAgICAgICAgICAgIGNhbGNfbXVsZGl2KHN2YWwsIHNvcHMpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKCEgbG9vcCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYoc3ZhbC5zaXplKCkgPT0gMCkKICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigi0J7RiNC40LHQutCwINGB0LjQvdGC0LDQutGB0LjRgdCwISIpOwoKICAgICAgICBudW0gPSBzdmFsLmdldCgwKTsKICAgICAgICBzdmFsLnJlbW92ZSgwKTsKCiAgICAgICAgZm9yKGludCBpID0gMDsgKGkgPCBzb3BzLnNpemUoKSkgJiYgKGkgPCBzdmFsLnNpemUoKSk7ICsraSl7CiAgICAgICAgICAgIHN3aXRjaChzb3BzLmdldChpKSl7CiAgICAgICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICAgICAgbnVtICs9IHN2YWwuZ2V0KGkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICAgICAgbnVtIC09IHN2YWwuZ2V0KGkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc29wcy5jbGVhcigpOwogICAgICAgIHN2YWwuY2xlYXIoKTsKICAgICAgICBzb3BzID0gbnVsbDsKICAgICAgICBzdmFsID0gbnVsbDsKICAgICAgICByZXR1cm4gbnVtOwogICAgfQoKICAgIC8v0L/RgNC40L7RgNC40YLQtdGC0L3Ri9C1INC+0L/QtdGA0LDRhtC40Lg6INGD0LzQvdC+0LbQtdC90LjQtSwg0LTQtdC70LXQvdC40LUKICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2FsY19tdWxkaXYoU3RhY2s8TG9uZz4gc3ZhbCwgU3RhY2s8Q2hhcmFjdGVyPiBzb3BzKXsKICAgICAgICBsb25nIHZhbDsKICAgICAgICBjaGFyIGNoOwoKICAgICAgICB3aGlsZSghIHNvcHMuaXNFbXB0eSgpKXsKICAgICAgICAgICAgY2ggPSBzb3BzLnBlZWsoKTsKICAgICAgICAgICAgaWYoKGNoID09ICcrJykgfHwgKGNoID09ICctJykpCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIHZhbCA9IHN2YWwucGVlaygpOwogICAgICAgICAgICBzdmFsLnBvcCgpOwogICAgICAgICAgICBpZihzdmFsLnNpemUoKSA9PSAwKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigi0J7RiNC40LHQutCwINGB0LjQvdGC0LDQutGB0LjRgdCwISIpOwoKICAgICAgICAgICAgaWYoY2ggPT0gJyonKQogICAgICAgICAgICAgICAgc3ZhbC5zZXQoc3ZhbC5zaXplKCkgLSAxLCBzdmFsLnBlZWsoKSAqIHZhbCk7CiAgICAgICAgICAgIGVsc2UgaWYoY2ggPT0gJy8nKXsKICAgICAgICAgICAgICAgIGlmKHZhbCA9PSAwTCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigi0JTQtdC70LXQvdC40LUg0L3QsCDQvdGD0LvRjCEiKTsKICAgICAgICAgICAgICAgIHN2YWwuc2V0KHN2YWwuc2l6ZSgpIC0gMSwgc3ZhbC5wZWVrKCkgLyB2YWwpOwogICAgICAgICAgICB9ICAgICAgICAgICAgIAogICAgICAgICAgICBzb3BzLnBvcCgpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDQutC+0L3QstC10YDRgtC40YDQvtCy0LDQvdC40LUg0YfQuNGB0LvQsCDQuNC3INGB0YLRgNC+0LrQuAogICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBUb0xvbmcoU3RyaW5nIHMsIGludFtdIGluZGV4KXsKICAgICAgICBsb25nIG4gPSAwTDsKICAgICAgICBpbnQgIGk7CgogICAgICAgIGZvcihpID0gaW5kZXhbMF07IGkgPCBzLmxlbmd0aCgpOyArK2kpewogICAgICAgICAgICBpZihDaGFyYWN0ZXIuaXNEaWdpdChzLmNoYXJBdChpKSkpewoKICAgICAgICAgICAgICAgIGlmKG4gPiBMT05HX01BWCB8fCBuIDwgTE9OR19NSU4pCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigi0J/QtdGA0LXQv9C+0LvQvdC10L3QuNC1INGH0LjRgdC70LAhIik7CgogICAgICAgICAgICAgICAgbiA9IG4gKiAxMEwgKyAobG9uZykgKHMuY2hhckF0KGkpIC0gJzAnKTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaW5kZXhbMF0gPSBpOwogICAgICAgIHJldHVybiBuOwogICAgfQoKICAgIC8v0L/RgNC+0LLQtdGA0LrQsCDQv9GA0LDQstC40LvRjNC90L7RgdGC0Lgg0YDQsNGB0YHRgtCw0L3QvtCy0LrQuCDRgdC60L7QsdC+0YfQvdGL0YUg0LLRi9GA0LDQttC10L3QuNC5CiAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzX3J1bGVzKFN0cmluZyBzKXsKICAgICAgICBpbnQgbiA9IDA7CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7ICsraSl7CiAgICAgICAgICAgIGlmKHMuY2hhckF0KGkpID09ICcoJykKICAgICAgICAgICAgICAgICsrbjsKICAgICAgICAgICAgZWxzZSBpZihzLmNoYXJBdChpKSA9PSAnKScpCiAgICAgICAgICAgICAgICAtLW47CiAgICAgICAgfQogICAgICAgIHJldHVybiAobiA9PSAwKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzX21hdGgoY2hhciBjaCl7CiAgICAgICAgcmV0dXJuIChjaCA9PSAnKycgfHwgY2ggPT0gJy0nIHx8IAogICAgICAgICAgICAgICAgY2ggPT0gJyonIHx8IGNoID09ICcvJyB8fCBjaCA9PSAnKCcpOwogICAgfQp9CgoKY2xhc3MgUHJvamVjdCB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgU3RyaW5nIHMgICA9ICItMS0oLTcqLTctKC0oLSgtKDEwLTIpLzIqMysxKS80KSsyKSsyLygxKygtKC0yKSszKygtNCkpKzUpKS8xMCI7CiAgICAgICAgbG9uZyAgIGp2bSA9IC0xLSgtNyotNy0oLSgtKC0oMTAtMikvMiozKzEpLzQpKzIpKzIvKDErKC0oLTIpKzMrKC00KSkrNSkpLzEwOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxvbmcgcmVzID0gRXhwci5DYWxjKHMpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oItC/0LDRgNGB0LXRgDogIiArIHJlcyk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3RhdGljOiAiICsganZtKTsKICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICB9Cn0=