document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. import java.util.Scanner;
  2. public class calculator {
  3.     public static void main(String[] args) {
  4.         Scanner get = new Scanner(System.in);
  5.         String take = new String("Y");      // Menginisialisasi agar program pertama memulai dapat berjalan
  6.         while(take.charAt(0)==\'Y\') {        // Karena nilai awal = Y maka loop dilakukan
  7.             convert use = new convert();    // class untuk melakukan penghitungan dijalankan
  8.             System.out.println("Try Again ? (Y/N)");    // Tekan Y jika ingin coba lagi atau N jika ingin keluar
  9.             take = get.nextLine();
  10.         }
  11.     }
  12. }
  13.  
  14. class Stack {       // Class Stack \'buatan\'
  15.     int index = -1; // Kondisi awal stack kosong (index = -1)
  16.     int limit = 10; // Batas ukuran array
  17.     Object[] virtual;   // Array utama yang bisa diisi object
  18.     Object[] temp;  // Array cadangan utk memindahkan isi array utama
  19.     Stack() {
  20.         virtual = new Object[limit];
  21.         temp = new Object[limit];
  22.     }
  23.     void push(Object obj) { // Membuat method push
  24.         index++;        // nilai index ditambah 1
  25.         if(index>=limit) {  // jika nilai index melebihi batas (limit) maka ...
  26.             temp = virtual;         // pindahkan isi array ke tempat cadangan
  27.             limit= limit+10;            // naikkan batas (limit) sebanyak 10
  28.             virtual = new Object[limit];    // buat array menjadi sebesar nilai batas (limit) yg sudah ditambah
  29.             for (int i = 0; i < limit-10; i++) virtual[i]=temp[i];  // pindahkan cadangan ke array utama
  30.             temp = new Object[limit];       // buat array cadangan menjadi lebih besar juga
  31.         }
  32.         virtual[index]=obj; // masukkan nilai dari push ke dalam array
  33.     }
  34.     Object top() {      // Membuat method top
  35.         return virtual[index];  // tunjukkan objek \'paling atas\' di array
  36.     }
  37.     Object pop() {       // Membuat method pop
  38.         index--;         // objek tidak dihapus, tetapi index dikurangi 1
  39.         return virtual[index+1]; // tunjukkan objek di posisi sebelum dikurangi
  40.     }
  41.     Object elementAt(int z) {   // Membuat method elementAt
  42.         return virtual[z];  // tunjukkan objek di posisi yang ditentukan (z)
  43.     }
  44.     boolean isEmpty() {         // Membuat method isEmpty
  45.         if(index!=-1) return false; // jika index sudah terisi nilai (method push pernah dijalankan) ..
  46.         return true;            // maka nilai nya \'salah\' , jika index masih -1 nilai nya \'benar\'
  47.     }
  48.     int size() {        // Membuat method size
  49.         return index+1;     // tunjukkan nilai index (ditambah 1)
  50.     }
  51.     void setEmpty() {       // Membuat method setEmpty
  52.         index=-1;       // jadikan nilai index menjadi -1 (anggap array belum pernah diisi)
  53.     }
  54. }
  55.  
  56. class convert {     // Class untuk menghitung masukan, dengan implementasi Shutting-yard Algorithm
  57.     Scanner get = new Scanner(System.in);
  58.     Stack func = new Stack();       // Stack sementara untuk menyimpan \'operand\' ( +  -  *  /  ^ )
  59.     Stack post  = new Stack();      // Stack untuk postfix hasil \'terjemahan\' dari infix
  60.     String input;
  61.     convert() {
  62.         System.out.print("Infix : ");
  63.         input = get.nextLine();             // Masukkan notasi infix
  64.         for (int i = 0; i < input.length(); i++) {
  65.             if(Character.isDigit(input.charAt(i)))  // Jika angka, langsung masuk Stack \'terjemahan\'
  66.                 post.push(input.charAt(i));
  67.             else
  68.                 readFunction(i);            // Jika \'operand\' diproses dengan method readFunction()
  69.         }
  70.         while(!func.isEmpty()) post.push(func.pop());   // Pindah semua \'operand\' sisa ke Stack \'terjemahan\'
  71.         System.out.print("Postfix : ");
  72.         for (int i = 0; i < input.length(); i++) {
  73.             System.out.print(post.elementAt(i));    // Cetak hasil \'terjemahan\'
  74.         }
  75.         System.out.println("");
  76.         System.out.println("Result : "+count());    // Cetak nilai hasil penghitungan dengan method count()
  77.        
  78.        
  79.     }
  80.     void readFunction(int r) {      // Membuat method readFunction,
  81.         char temp = input.charAt(r);    // referensi --> wikipedia, Shutting-yard Algorithm
  82.         char top;
  83.         if(!func.isEmpty()) {
  84.             top  = (char) func.top();
  85.             if(level(temp)<=level(top)) {
  86.                 post.push(func.pop());
  87.                 readFunction(r);
  88.             }
  89.             else
  90.                 func.push(temp);
  91.             }    
  92.         else
  93.             func.push(temp);
  94.     }
  95.     int level(char c) {         // Urutan \'operand\' , secara terbalik
  96.         if(c==\'+\'||c==\'-\') return 1;
  97.         if(c==\'*\'||c==\'/\') return 2;
  98.         if(c==\'^\') return 3;
  99.         return -1;
  100.     }
  101.     Object count() {            // Membuat method untuk menghitung postfix hasil \'terjemahan\'
  102.         Stack result = new Stack();
  103.         int temp;
  104.         char c;
  105.         for (int i = 0; i < input.length(); i++) {
  106.             c = (char) post.elementAt(i);
  107.             if( Character.isDigit(c) ) { result.push(c); }  // Jika angka masukkan Stack
  108.             if( c==\'+\') {
  109.                 temp= Integer.parseInt( result.pop()+"" );
  110.                 temp= temp + Integer.parseInt( result.pop()+"" );
  111.                 result.push(temp);
  112.             }
  113.             if( c==\'-\') {
  114.                 temp= Integer.parseInt( result.pop()+"" );
  115.                 temp= Integer.parseInt( result.pop()+"" )-temp;
  116.                 result.push(temp);
  117.             }
  118.             if( c==\'*\') {
  119.                 temp= Integer.parseInt( result.pop()+"" );
  120.                 temp= temp * Integer.parseInt( result.pop()+"" );
  121.                 result.push(temp);
  122.             }
  123.             if( c==\'/\') {
  124.                 temp= Integer.parseInt( result.pop()+"" );
  125.                 temp= Integer.parseInt( result.pop()+"" )/temp;
  126.                 result.push(temp);
  127.             }
  128.             if( c==\'^\') {
  129.                 temp= Integer.parseInt( result.pop()+"" );
  130.                 temp= (int) Math.pow( Integer.parseInt( result.pop()+"" ),temp);
  131.                 result.push(temp);
  132.             }
  133.         }
  134.         return result.elementAt(0);
  135.     }
  136. }
');