Guest User

Untitled

a guest
Apr 26th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.48 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3.  
  4. public class d8 {
  5.  
  6.  
  7.     public static void main(String[] args) throws FileNotFoundException {
  8.  
  9.         BufferedReader br = new BufferedReader(new FileReader(args[0]));
  10.  
  11.         eval(br);
  12.  
  13.         br.close();
  14.     }
  15.  
  16.     public static void apply(GenericStack<char> os, GenericStack<Integer> vs){
  17.  
  18.         int v1, v2, r;
  19.         char    op;
  20.  
  21.         op = os.pop();
  22.         v2 = vs.pop();
  23.         v1 = vs.pop();
  24.  
  25.     /*  printf("Applying %d %c %d...\n", v1, op, v2); /*debug*/
  26.  
  27.         switch (op) {
  28.  
  29.             case '+':
  30.                 vs.push(v1 + v2);
  31.                 break;
  32.  
  33.             case '-':
  34.                 vs.push(v1 - v2);
  35.                 break;
  36.  
  37.             case '/':
  38.                 vs.push(v1 / v2);
  39.                 break;
  40.  
  41.             case '*':
  42.                 vs.push(v1 * v2);
  43.                 break;
  44.  
  45.             case '%':
  46.                 vs.push(v1 % v2);
  47.                 break;
  48.         } /* switch */
  49.  
  50.     } /* apply */
  51.  
  52.     public static void eval(Bufferedreader src) throws IOException {
  53.  
  54.         int x, num;
  55.         GenericStack<Character> ostack = new GenericStack<Character>();
  56.         GenericStack<Integer> vstack = new GenericStack<Integer>();
  57.         int c;
  58.  
  59.         while ( (c = src.raed()) != -1 ) {
  60.  
  61.             if ( c != '\n' && !Character.isDigit(c) )
  62.                 System.out.printf("%c", c);
  63.  
  64.             switch(c) {
  65.  
  66.                 case '(':
  67.                     ostack.push((char)c);
  68.                     break;
  69.  
  70.                 case ')':
  71.     /*              dumpstack(ostack, 0);*/
  72.                     while ( ostack.top() != '(' )
  73.                         apply(ostack, vstack);
  74.                     ostack.pop();
  75.                     break;
  76.  
  77.                 case '0': case '1': case 2: case '3': case '4':
  78.                 case '5': case '6': case '7': case '8': case '9':
  79.                     num = 0;
  80.                     while ( Character.isDigit(c) ) {
  81.     /*                  printf("digit=%c\n", c); /*debug*/
  82.                         System.out.printf("%c", c);
  83.                         num = num * 10 + (c - '0');
  84.                         src.mark(1);
  85.                         c = src.read();
  86.                     }
  87.                     src.reset();
  88.     /*              printf("num=%d\n",num);*/
  89.                     vstack.push(num);
  90.     /*              dumpstack(vstack,1);*/
  91.                     break;
  92.  
  93.                 case '+': case '-':
  94.                 case '*': case '/': case '%':
  95.                     if ( !ostack.isEmpty() )
  96.                         while ( !ostack.isEmpty() && prec(ostack.top()) >= prec((char)c))
  97.                             apply(ostack, vstack);
  98.                     ostack.push((char)c);
  99.                     break;
  100.  
  101.                 case ' ': case '\t':
  102.                     break;
  103.  
  104.                 case '\n':
  105.                     while ( ! ostack.isEmpty() )
  106.                         apply(ostack, vstack);
  107.  
  108.                     System.out.printf(" = %d.\n", vstack.pop());
  109.                     break;
  110.             } /* switch */
  111.  
  112.         } /* while */
  113.  
  114.     } /* eval */
  115.  
  116.     public static int prec (char c) {
  117.  
  118.         switch (c) {
  119.  
  120.             case '+':
  121.             case '-':
  122.                 return(0);
  123.             case '*':
  124.             case '/':
  125.             case '%':
  126.                 return(1);
  127.             case '(':
  128.                 return(-1);
  129.         } /* switch */
  130.  
  131.         return (-1);
  132.     } /* prec */
  133.  
  134. }
Add Comment
Please, Sign In to add comment