This is a picture of unique shoji :)
1. Introduction
I enjoyed implementing a calculator. It can calculate as follows :)
1 + 2 Answer: 3
1 + 2 x (10 + 1) Answer: 23
(1 + 1) x (1 + 2) Answer: 6
1 + 2 x (10 + 1) Answer: 23
(1 + 1) x (1 + 2) Answer: 6
2. Program
2.1. Input
As for a program input, I supposed like the following letter string.
[Input]
1+2
1+1*(10+0)
(1+1)*(1+2)
1+2
1+1*(10+0)
(1+1)*(1+2)
2.2. Output
As for a program output, it's simply its calculation result.
In the above cases, the output is as follows.
In the above cases, the output is as follows.
[Output]
3
11
6
3
11
6
2.3. Implementation
I can simply implement by using a stack and a recursive call as follows.
Thanks to the recursive call, we can calculate the text within parentheses :)
Main.java
Thanks to the recursive call, we can calculate the text within parentheses :)
Main.java
package org.inut;
import java.util.*;
class Main {
public void pushCalcStack(int currNum, char operator, Deque<Integer> calcStack) {
if (operator == '+') {
calcStack.push(currNum);
} else if (operator == '-') {
calcStack.push(-currNum);
} else if (operator == '*') {
int prevNum = calcStack.pop();
calcStack.push(prevNum * currNum);
} else if (operator == '/') {
int prevNum = calcStack.pop();
calcStack.push(prevNum / currNum);
}
}
public int simpleCalc(String str) {
Deque<Integer> calcStack = new ArrayDeque();
int calcResult = 0;
char operator = '+';
int currNum = 0;
int currIndex = 0;
boolean isParentheses = false;
int startIndex = 0;
for (char letter : str.toCharArray()) {
if (Character.isDigit(letter)) {
currNum = 10 * currNum + letter - '0';
} else {
if (letter == '(') {
isParentheses = true;
startIndex = currIndex + 1;
}
if (letter == ')') {
isParentheses = false;
currNum = simpleCalc(s.substring(startIndex, currIndex));
}
if (!isParentheses) {
pushCalcStack(currNum, operator, calcStack);
operator = letter;
currNum = 0;
}
}
currIndex++;
}
if (currNum != 0)
pushCalcStack(currNum, operator, calcStack);
for (int num : calcStack)
calcResult += num;
return calcResult;
}
public static void main(String[] args) {
String input = "2*(1+2)/2-1*(5*3)";
int calcResult = new Main().simpleCalc(input);
System.out.println(calcResult);
}
}
import java.util.*;
class Main {
public void pushCalcStack(int currNum, char operator, Deque<Integer> calcStack) {
if (operator == '+') {
calcStack.push(currNum);
} else if (operator == '-') {
calcStack.push(-currNum);
} else if (operator == '*') {
int prevNum = calcStack.pop();
calcStack.push(prevNum * currNum);
} else if (operator == '/') {
int prevNum = calcStack.pop();
calcStack.push(prevNum / currNum);
}
}
public int simpleCalc(String str) {
Deque<Integer> calcStack = new ArrayDeque();
int calcResult = 0;
char operator = '+';
int currNum = 0;
int currIndex = 0;
boolean isParentheses = false;
int startIndex = 0;
for (char letter : str.toCharArray()) {
if (Character.isDigit(letter)) {
currNum = 10 * currNum + letter - '0';
} else {
if (letter == '(') {
isParentheses = true;
startIndex = currIndex + 1;
}
if (letter == ')') {
isParentheses = false;
currNum = simpleCalc(s.substring(startIndex, currIndex));
}
if (!isParentheses) {
pushCalcStack(currNum, operator, calcStack);
operator = letter;
currNum = 0;
}
}
currIndex++;
}
if (currNum != 0)
pushCalcStack(currNum, operator, calcStack);
for (int num : calcStack)
calcResult += num;
return calcResult;
}
public static void main(String[] args) {
String input = "2*(1+2)/2-1*(5*3)";
int calcResult = new Main().simpleCalc(input);
System.out.println(calcResult);
}
}
3. Extension
If we want to use other parentheses such as '{' and '[', we can do that by using a recursive call and modifying some conditions :)