久々のプログラミング練習

今度の仕事が Java & Python なんで eclipse インストールして Java のプログラムを久々に書いてみました。
ざっくりですが「与えられた数式を再帰を使って計算しなさい」という問題。いってみよー!

Sample004k.java

package hello2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Sample004k {
	public static void main(String[] args) {
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
			Equation equation = new Equation(reader.readLine());
			System.out.println(equation.evaluate());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

パッケージ名とかクラス名とか、めちゃくちゃテキトーw
エラー処理は一切書いていないです。変な入力データを入力するヤツが悪なのでーすw
あとタブ幅が 8 になるのが嫌デース。変える方法わかりまセーン。

真面目に解説すると、ちゃんとクラスを作って main からはすぐ離れる事が大切デース。
でないと、「スタティックおじさん」になってしまいまーす。

Equation.java

package hello2;

import java.util.Stack;

public class Equation {
	String[] equ;
	
	Equation() {
		equ = new String[0];
	}
	
	Equation(String str) {
		equ = str.split(" ");
	}
	
	public int evaluate() {
		return evalRpn(makeRpn());
	}
	
	private String makeRpn() {
		Stack<String> stack = new Stack<String>();
		String ret = "";
		
		for (int i = 0; i < equ.length; i++) {
			if (equ[i].equals("(")) {
				stack.push(equ[i]);
			}
			else if (equ[i].equals(")")) {
				String val = stack.pop();
				while (!val.equals("(")) {
					ret = addString(ret, val);
					val = stack.pop();
				}
			}
			else if (equ[i].equals("+") || equ[i].equals("-"))
			{
				if (!stack.isEmpty() && (stack.peek().equals("+") || stack.peek().equals("-"))) {
					ret = addString(ret, stack.pop());
				}
				stack.push(equ[i]);
			}
			else
			{
				ret = addString(ret, equ[i]);
			}
		}
		
		while(!stack.isEmpty()) {
			ret = addString(ret, stack.pop());
		}
		return ret;
	}
	
	private int evalRpn(String rpn) {
		Stack<Integer> stack = new Stack<Integer>();
		String[] str = rpn.split(" ");
		System.out.println("DEBUG: " + rpn);
		
		for (int i = 0; i < str.length; i++) {
			if (!str[i].equals("+") && !str[i].equals("-")) {
				stack.push(Integer.parseInt(str[i]));
			}
			else
			{
				if (str[i].equals("+")) {
					int val1 = stack.pop();
					int val2 = stack.pop();
					stack.push(val2 + val1);
				}
				else
				{
					int val1 = stack.pop();
					int val2 = stack.pop();
					stack.push(val2 - val1);					
				}
			}
		}
		return stack.pop();
	}
	
	private String addString(String str1, String str2) {
		String ret;
		
		if (str1.equals("")) {
			ret = str1 + str2;
		}
		else
		{
			ret = str1 + " " + str2;
		}
		
		return ret;
	}
}

再帰使ってナーイwww てか、Java再帰とか正気デスカー!!www
java再帰とかめちゃくちゃやりにくいので、そんなものは使いませーん!
あと掛け算とか割り算とかは、「最新のこんぴゅーたー」でも解けないので、世の中に存在しませーん!(ニコちゃん大王か)

実行ボタンが右向き矢印、これは昔で言うカセットテープの再生マークになっているけど、最近のカセットテープを知らない世代の若い人に「再生ボタン」=「実行」って理解できるのか、激しく謎デース!ちなみに保存のアイコンもフロッピーディスクがよく使われるけれども、これも最近のフロッピーディスクを知らない世代の若い人に「フロッピーディスクボタン」=「保存」って理解できるのか、激しく謎デース!

自分はカセットテープもフロッピーディスクもプログラムの保存メディアとして使っていた世代なので、アイコンの意味は余裕でわかりマース!

そんなことはどうでもよくないかもだけど、とりあえず実行してみマース!

23 + 58 + 7 - ( 10 + 3 ) - ( 3 - 2 - ( 5 + 4 - ( 8 - 2 ) + 8 ) )
DEBUG: 23 58 + 7 + 10 3 + - 3 2 - 5 4 + 8 2 - - 8 + - -
85

なんとか合ってそうデース!
こんなにカッコがある式が計算できるなんて「最新のこんぴゅーたー」すげー!www

以上デース。