Dr.Kongデザインロボットはカドーは最近学んだいくつかの単純な機能評価により、将来的に加減算を習得しました。例えば、追加(10、98)の値は、関数分(20、23)の値が20であることを知っている108等です。訓練の後、Dr.Kongデザインロボットは、より複雑な式のネストされた計算にカドー。
仮定発現は単にとして定義することができる:1、正の数xが小数表現です。XおよびYが式である場合に2は、関数の最小(x、y)は、その値が最小数で、X、Yで表現です。図3は、XおよびYが式である場合、関数max(x、y)は、その値xは、yは最大数で表現です。XおよびYが式であれば図4は、機能を追加する(x、y)は、その値は、X、Y和で表現です。図5は、関数sub(x、y)は、その値xは式であり、xおよびyは式である場合、yは差です。例えば、発現maxは7の値((1,2)、7を追加します)。
ヘルプDr.Kongへの表現の特定のセットのためにしてください書き込みプログラムは、善悪のカドー計算を校正するために正しい答えを計算します。
入力フォーマット:
最初のライン:Nは次計算する式の数(1≤N≤10)がN行を有し表し、各行が評価される式を表す文字列です。(行あたりの余分なスペースこれ以上300文字以下の式、小数点表現の数は1000以上には表示されません)
出力フォーマット:
出力はN行、式の値に対応する行です。
サンプル入力:
ここでは、入力のセットを与えられています。例えば:
3
add(1,2)
sub(1,999)
add(min(1,1000),add(100,99))
出力例:
出力に対応し、ここで考えます。例えば:3
-998 200
コード:
輸入 java.utilの。* ; クラスNUM { プライベート intは左。 プライベート int型の右; 公共 のint getLeft(){ リターン左; } 公共 ボイド setLeft(intは左){ この .LEFT =は左; } 公共 INT GetRightの(){ 戻り右。 } 公共 ボイド setRight(INT 右){ この .RIGHT = 右。 } } パブリック クラスメイン{ 公共 静的 ボイドメイン(文字列[]引数){ スキャナSC = 新しいスキャナ(System.in)。 INT N = sc.nextInt(); sc.nextLine()。 スタック <文字列> STK = 新しいスタック<文字列> (); スタック <整数> stkNum = 新しいスタック<整数> (); INT K = 0 。 以下のために(INT ; I <N; iが0 = I ++ ){ 文字列の行 = sc.nextLine()。 もし(line.length()== 1){ int型 NUM = Integer.parseInt(ライン) System.out.println(NUM)。 } 他{ int型のインデックス= 0 。 int型のp = 0 ; 一方、(真){ インデックス = line.indexOf( "("、指数+ 1 ); 場合(インデックス== -1)ブレーク; P = line.indexOf( ""、P + 1 ); もし(P == -1)休憩; NUM NUM =getNum(P、ライン) もし(!num.getLeft()= - 999 ){ stkNum.push(num.getLeft())。 } もし(!num.getRight()= - 999 ){ stkNum.push(num.getRight())。 } 文字列のサブ =(インデックス3 line.substring 、インデックス)。 stk.push(サブ)。 } 一方(stk.size()!= 0 ){ 文字列OPT = stk.pop()。 もし(opt.equals( "MIN" )){ int型、D =分(stkNum.pop()、stkNum.pop())。 stkNum.push(D)。 } そう であれば(opt.equals( "MAX" )){ int型 D = MAX(stkNum.pop()、stkNum.pop())。 stkNum.push(D)。 } そう であれば(opt.equalsは( "追加" )){ int型 D = 追加(stkNum.pop()、stkNum.pop())。 stkNum.push(D)。 } そう であれば(opt.equals( "サブ" )){ int型、D = サブ(stkNum.pop()、stkNum.pop())。 stkNum.push(D)。 } } のSystem.out.println(stkNum.pop())。 K = 0 。 } } )(sc.close。 } プライベート 静的 int型のサブ(INT I、INT J){ リターン J- I; } プライベート 静的 int型の追加(INT I、int型のJ){ 戻り I + jは、 } プライベート 静的の int型の最大値(int型 I、int型 J){ 返す I> = jは?I:J。 } プライベート 静的 整数分(INT I、int型のJ){ 戻り I> = jは?J:私は。 } プライベート 静的 NUM getNum(int型のP、文字列のライン){ int型、A = P B = P。 一方、((line.substring、+ 1).equals( "(")&&(line.substring、+ 1).equals( ")"!{)) - 。 } しばらく(!line.substring(B、B + 1).equals( ")")&&!line.substring(B、B + 1).equals( "M")&&!line.substring(B、B + 1) .equals( "")&& line.substring(B、B + 1).equals( "S"! )){ B ++ 。 } 文字列は、左(+ 1 line.substring = 、p)を。 文字列右 = line.substring(P + 1 、B)。 NUM NUM = 新しいNUM(); num.setLeft( -999 )。 num.setRight( -999 )。 もし(left.length()> = 1 ){ int型 LNUM = Integer.parseInt(左)。 NUM。 (right.length()> = 1 ){ int型 RNUM = Integer.parseInt(右)。 num.setRight(RNUM)。 } 戻りNUM。 } }