Skip to content

Instantly share code, notes, and snippets.

@torazuka
Created August 29, 2012 13:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save torazuka/3512875 to your computer and use it in GitHub Desktop.
Save torazuka/3512875 to your computer and use it in GitHub Desktop.
四則演算をするスタックマシン
import java.util.ArrayDeque;
import java.util.Deque;
interface Token {
Deque<Integer> execute(Deque<Integer> stack);
}
class Operand implements Token {
Integer value;
Operand(Integer val) {
value = val;
}
@Override
public Deque<Integer> execute(Deque<Integer> stack) {
stack.push(value);
System.out.println("[スタック] <= " + value);
return stack;
}
}
interface Operator extends Token {
// Deque<Integer> execute(Deque<Integer> stack);
}
class Add implements Operator {
@Override
public Deque<Integer> execute(Deque<Integer> stack) {
if (stack != null) {
Integer num1 = stack.pop();
System.out.println("[スタック] => " + num1);
Integer num0 = stack.pop();
System.out.println("[スタック] => " + num0);
stack.push(num0 + num1);
System.out.println("[スタック] <= " + (num0 + num1));
}
return stack;
}
}
class Sub implements Operator {
@Override
public Deque<Integer> execute(Deque<Integer> stack) {
if (stack != null) {
Integer num1 = stack.pop();
System.out.println("[スタック] => " + num1);
Integer num0 = stack.pop();
System.out.println("[スタック] => " + num0);
stack.push(num0 - num1);
System.out.println("[スタック] <= " + (num0 - num1));
}
return stack;
}
}
class Mul implements Operator {
@Override
public Deque<Integer> execute(Deque<Integer> stack) {
if (stack != null) {
Integer num1 = stack.pop();
System.out.println("[スタック] => " + num1);
Integer num0 = stack.pop();
System.out.println("[スタック] => " + num0);
stack.push(num0 * num1);
System.out.println("[スタック] <= " + (num0 * num1));
}
return stack;
}
}
class Div implements Operator {
@Override
public Deque<Integer> execute(Deque<Integer> stack) {
if (stack != null) {
Integer num1 = stack.pop();
System.out.println("[スタック] => " + num1);
Integer num0 = stack.pop();
System.out.println("[スタック] => " + num0);
if (num1 != 0) {
stack.push(num0 / num1);
System.out.println("[スタック] <= " + (num0 / num1));
}
}
return stack;
}
}
public class StackMachine {
protected Token createToken(String s) {
Token result = null;
if (s.equals("+")) {
result = new Add();
} else if (s.equals("-")) {
result = new Sub();
} else if (s.equals("*")) {
result = new Mul();
} else if (s.equals("/")) {
result = new Div();
} else {
result = new Operand(Integer.valueOf(s));
}
return result;
}
protected int execute(String input) {
Deque<Integer> stack = new ArrayDeque<>();
String[] splited = input.split("\\s");
if (splited != null && 0 < splited.length) {
for (String s : splited) {
Token token = createToken(s);
token.execute(stack);
}
}
return stack.pop();
}
public static void main(String[] args) {
StackMachine stackMachine = new StackMachine();
// (1 + 2) * 4 + (4 - 2) == 14
System.out.println(stackMachine.execute("1 2 + 4 * 4 2 - +"));
// (1 + 4) * (3 + 7) / 5 == 10
System.out.println(stackMachine.execute("1 4 + 3 7 + * 5 /"));
// 10 + 2 == 12
System.out.println(stackMachine.execute("10 2 +"));
// 10 / 2 == 5
System.out.println(stackMachine.execute("10 2 /"));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment