の回答で解決済みっぽい?
Like!
static String[] p_notation; //後置記法の式
static int p_idx=0;
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
Scanner scan=new Scanner(System.in);
String s=scan.next();
try {
int cnt=0;
if(Character.isLetter(s.charAt(cnt))){
cnt+=1;
while(Character.isLetter(s.charAt(cnt)))
cnt+=1;
}else {
throw new ArithmeticException("入力エラー");
}
String var=""; //変数のみ
var+=s.substring(0,cnt);
String[] fomula; //'='と変数以外
fomula=split_infix(s.substring(cnt+1,s.length()));
E(fomula); //後置記法に変換
System.out.println(var+"="+Keisan(p_notation)); //計算結果の出力
}catch(ArithmeticException e) {
System.out.println(e);
System.exit(1);
}
}
public static String Keisan(String[] s) { //後置記法を計算
// TODO 自動生成されたメソッド・スタブ
Deque<String> stack = new ArrayDeque<>(); //スタック
try {
for(int i=0;i<s.length;i++) {
if(s[i].equals("+")) {
int a=Integer.valueOf(stack.pop());
int b=Integer.valueOf(stack.pop());
int sum=a+b;
stack.push(String.valueOf(sum));
}
else if(s[i].equals("-")) {
int a=Integer.valueOf(stack.pop());
int b=Integer.valueOf(stack.pop());
int sum=a-b;
stack.push(String.valueOf(sum));
}
else if(s[0].equals("*")) {
int a=Integer.valueOf(stack.pop());
int b=Integer.valueOf(stack.pop());
int sum=a*b;
stack.push(String.valueOf(sum));
}
else if(s[i].equals("/")) {
int a=Integer.valueOf(stack.pop());
int b=Integer.valueOf(stack.pop());
int sum=a/b;
stack.push(String.valueOf(sum));
}
else {
stack.push(String.valueOf(s.charAt(i)));
}
}
System.out.println(p_notation);
}catch(ArithmeticException e) {
System.out.println("除算エラーです。");
System.exit(1);
}catch(Exception e) {
System.out.println("式が不正です。");
System.exit(1);
}
String st=stack.pop();
return st;
}
public static void E(String[] s) {
// TODO 自動生成されたメソッド・スタブ
s=T(s);
while(s!=null && s[0]=="+" || s[0]=="-") {
List<String> list = Arrays.asList(s);
String ch="";
ch=s[0];
list.remove(0);
s=T(s=list.toArray(new String[list.size()]));
p_notation[p_idx]=s[0];
p_idx++;
}
}
public static String[] T(String[] s) {
// TODO 自動生成されたメソッド・スタブ
s=F(s);
while(s!=null && s[0]=="*" || s[0]=="/") {
List<String> list = Arrays.asList(s);
String ch="";
ch=s[0];
list.remove(0);
s=T(s=list.toArray(new String[list.size()]));
p_notation[p_idx]=s[0];
p_idx++;
}
return s;
}
public static String[] F(String[] s) {
// TODO 自動生成されたメソッド・スタブ
List<String> list = Arrays.asList(s);
if(Character.isDigit(s[0].charAt(0))) { //数値か判定
p_notation[p_idx]=s[0];
p_idx++;
list.remove(0);
s=list.toArray(new String[list.size()]);
return s;
}
else if(s[0]=="(") {
Deque<String> tmp = new ArrayDeque<>();
Deque<String> stack = new ArrayDeque<>();
stack.push(s[0]);
list.remove(0);
s=list.toArray(new String[list.size()]);
while(stack.peek()!="") { //stackの中身があるならループ
if(s[0]=="(") {
stack.push(s[0]);
list.remove(0);
s=list.toArray(new String[list.size()]);
}
else if(s[0]==")") {
stack.pop();
list.remove(0);
s=list.toArray(new String[list.size()]);
}
else {
tmp.push(s[0]);
list.remove(0);
s=list.toArray(new String[list.size()]);
}
}
E(tmp.toArray(s));
return s;
}
return s;
}
public static String[] split_infix(String s) {
// TODO 自動生成されたメソッド・スタブ
String[] token=new String[s.length()];
int idx=0;
int cnt=0;
while(true) {
if(cnt==s.length()) break;
else if(Character.isDigit(s.charAt(cnt))){ //数値か判定
String tmp="";
tmp+=s.charAt(cnt);
cnt+=1;
while(cnt!=s.length() && Character.isDigit(s.charAt(cnt))) {
tmp+=s.charAt(cnt);
cnt+=1;
}
token[idx]=tmp;
idx+=1;
}
else {
token[idx]=String.valueOf(s.charAt(cnt));
cnt+=1;
idx+=1;
}
}
return token;
}
javaで括弧()つきでの四則演算ができる電卓のプログラムを書いています。
入力は
x=1+2
みたいな形で
出力は
12+
x=3
のように中置記法を後置記法にした形と、計算結果を出力したいです。
現在の出力結果は
$java Dentaku
x=1+2
Exception in thread "main" java.lang.NullPointerException
at Gengo_ensyu2.F(Gengo_ensyu2.java:132)
at Gengo_ensyu2.T(Gengo_ensyu2.java:112)
at Gengo_ensyu2.E(Gengo_ensyu2.java:97)
at Gengo_ensyu2.main(Gengo_ensyu2.java:35)
となります。
の回答で解決済みっぽい?