63 lines
1.5 KiB
Text
63 lines
1.5 KiB
Text
use IO;
|
|
use Struct;
|
|
|
|
bundle Default {
|
|
class RpnCalc {
|
|
function : Main(args : String[]) ~ Nil {
|
|
Caculate("3 4 2 * 1 5 - 2 3 ^ ^ / +");
|
|
}
|
|
|
|
function : native : Caculate(rpn : String) ~ Nil {
|
|
rpn->PrintLine();
|
|
|
|
tokens := rpn->Split(" ");
|
|
stack := FloatVector->New();
|
|
each(i : tokens) {
|
|
token := tokens[i]->Trim();
|
|
if(token->Size() > 0) {
|
|
if(token->Get(0)->IsDigit()) {
|
|
stack->AddBack(token->ToFloat());
|
|
}
|
|
else {
|
|
right := stack->Get(stack->Size() - 1); stack->RemoveBack();
|
|
left := stack->Get(stack->Size() - 1); stack->RemoveBack();
|
|
select(token->Get(0)) {
|
|
label '+': {
|
|
stack->AddBack(left + right);
|
|
}
|
|
|
|
label '-': {
|
|
stack->AddBack(left - right);
|
|
}
|
|
|
|
label '*': {
|
|
stack->AddBack(left * right);
|
|
}
|
|
|
|
label '/': {
|
|
stack->AddBack(left / right);
|
|
}
|
|
|
|
label '^': {
|
|
stack->AddBack(right->Power(left));
|
|
}
|
|
};
|
|
};
|
|
PrintStack(stack);
|
|
};
|
|
};
|
|
Console->Print("result: ")->PrintLine(stack->Get(0));
|
|
}
|
|
|
|
function : PrintStack(stack : FloatVector) ~ Nil {
|
|
" ["->Print();
|
|
each(i : stack) {
|
|
stack->Get(i)->Print();
|
|
if(i + 1< stack->Size()) {
|
|
", "->Print();
|
|
};
|
|
};
|
|
']'->PrintLine();
|
|
}
|
|
}
|
|
}
|