import java.util.Scanner;
public class calculator {
public static void main(String[] args) {
Scanner get = new Scanner(System.in);
String take = new String("Y"); // Menginisialisasi agar program pertama memulai dapat berjalan
while(take.charAt(0)==\'Y\') { // Karena nilai awal = Y maka loop dilakukan
convert use = new convert(); // class untuk melakukan penghitungan dijalankan
System.out.println("Try Again ? (Y/N)"); // Tekan Y jika ingin coba lagi atau N jika ingin keluar
take = get.nextLine();
}
}
}
class Stack { // Class Stack \'buatan\'
int index = -1; // Kondisi awal stack kosong (index = -1)
int limit = 10; // Batas ukuran array
Object[] virtual; // Array utama yang bisa diisi object
Object[] temp; // Array cadangan utk memindahkan isi array utama
Stack() {
virtual = new Object[limit];
temp = new Object[limit];
}
void push(Object obj) { // Membuat method push
index++; // nilai index ditambah 1
if(index>=limit) { // jika nilai index melebihi batas (limit) maka ...
temp = virtual; // pindahkan isi array ke tempat cadangan
limit= limit+10; // naikkan batas (limit) sebanyak 10
virtual = new Object[limit]; // buat array menjadi sebesar nilai batas (limit) yg sudah ditambah
for (int i = 0; i < limit-10; i++) virtual[i]=temp[i]; // pindahkan cadangan ke array utama
temp = new Object[limit]; // buat array cadangan menjadi lebih besar juga
}
virtual[index]=obj; // masukkan nilai dari push ke dalam array
}
Object top() { // Membuat method top
return virtual[index]; // tunjukkan objek \'paling atas\' di array
}
Object pop() { // Membuat method pop
index--; // objek tidak dihapus, tetapi index dikurangi 1
return virtual[index+1]; // tunjukkan objek di posisi sebelum dikurangi
}
Object elementAt(int z) { // Membuat method elementAt
return virtual[z]; // tunjukkan objek di posisi yang ditentukan (z)
}
boolean isEmpty() { // Membuat method isEmpty
if(index!=-1) return false; // jika index sudah terisi nilai (method push pernah dijalankan) ..
return true; // maka nilai nya \'salah\' , jika index masih -1 nilai nya \'benar\'
}
int size() { // Membuat method size
return index+1; // tunjukkan nilai index (ditambah 1)
}
void setEmpty() { // Membuat method setEmpty
index=-1; // jadikan nilai index menjadi -1 (anggap array belum pernah diisi)
}
}
class convert { // Class untuk menghitung masukan, dengan implementasi Shutting-yard Algorithm
Scanner get = new Scanner(System.in);
Stack func = new Stack(); // Stack sementara untuk menyimpan \'operand\' ( + - * / ^ )
Stack post = new Stack(); // Stack untuk postfix hasil \'terjemahan\' dari infix
String input;
convert() {
System.out.print("Infix : ");
input = get.nextLine(); // Masukkan notasi infix
for (int i = 0; i < input.length(); i++) {
if(Character.isDigit(input.charAt(i))) // Jika angka, langsung masuk Stack \'terjemahan\'
post.push(input.charAt(i));
else
readFunction(i); // Jika \'operand\' diproses dengan method readFunction()
}
while(!func.isEmpty()) post.push(func.pop()); // Pindah semua \'operand\' sisa ke Stack \'terjemahan\'
System.out.print("Postfix : ");
for (int i = 0; i < input.length(); i++) {
System.out.print(post.elementAt(i)); // Cetak hasil \'terjemahan\'
}
System.out.println("");
System.out.println("Result : "+count()); // Cetak nilai hasil penghitungan dengan method count()
}
void readFunction(int r) { // Membuat method readFunction,
char temp = input.charAt(r); // referensi --> wikipedia, Shutting-yard Algorithm
char top;
if(!func.isEmpty()) {
top = (char) func.top();
if(level(temp)<=level(top)) {
post.push(func.pop());
readFunction(r);
}
else
func.push(temp);
}
else
func.push(temp);
}
int level(char c) { // Urutan \'operand\' , secara terbalik
if(c==\'+\'||c==\'-\') return 1;
if(c==\'*\'||c==\'/\') return 2;
if(c==\'^\') return 3;
return -1;
}
Object count() { // Membuat method untuk menghitung postfix hasil \'terjemahan\'
Stack result = new Stack();
int temp;
char c;
for (int i = 0; i < input.length(); i++) {
c = (char) post.elementAt(i);
if( Character.isDigit(c) ) { result.push(c); } // Jika angka masukkan Stack
if( c==\'+\') {
temp= Integer.parseInt( result.pop()+"" );
temp= temp + Integer.parseInt( result.pop()+"" );
result.push(temp);
}
if( c==\'-\') {
temp= Integer.parseInt( result.pop()+"" );
temp= Integer.parseInt( result.pop()+"" )-temp;
result.push(temp);
}
if( c==\'*\') {
temp= Integer.parseInt( result.pop()+"" );
temp= temp * Integer.parseInt( result.pop()+"" );
result.push(temp);
}
if( c==\'/\') {
temp= Integer.parseInt( result.pop()+"" );
temp= Integer.parseInt( result.pop()+"" )/temp;
result.push(temp);
}
if( c==\'^\') {
temp= Integer.parseInt( result.pop()+"" );
temp= (int) Math.pow( Integer.parseInt( result.pop()+"" ),temp);
result.push(temp);
}
}
return result.elementAt(0);
}
}