intermediate/StackCalculator

From ggc

Jump to: navigation, search

001 package intermediate;
002 
003 import java.io.ByteArrayInputStream;
004 import java.util.Scanner;
005 import java.util.Stack;
006 import java.util.StringTokenizer;
007 import wiki.*;
008 
009 
010 public class StackCalculator
011 {
012 
013   /*public static double getExpressionValue(String expression)
014 {
015     if(expression.contains("+"))
016     {
017       ByteArrayInputStream bis=new ByteArrayInputStream(expression.getBytes());
018       Scanner scanner=new Scanner(bis);
019       double x=scanner.nextDouble();
020     }
021     if(expression.contains("-"))
022     {
023       
024     }
025     if(expression.contains("*"))
026     {
027       
028     }
029     if(expression.contains("/"))
030     {
031       
032     }
033 }*/
034 
035   public static String getInnerMostExpression(String expression)
036   {
037     int firstRight=expression.indexOf(")");
038     if(firstRight<0return expression;
039     int lastLeft=expression.substring(0, firstRight).lastIndexOf("(");
040     String contents=expression.substring(lastLeft+1, firstRight);
041     return contents;
042   }
043 
044   private static String getStackText(Stack stack)
045   {
046     String text="B ";
047     for(int i=0; i<stack.size(); i++)
048     {
049       text+=stack.get(i)+" ";
050     }
051     return text;
052   }
053 
054   /**
055    @param args
056    */
057   public static void main(String[] args)
058   {
059     Wiki.out.println("Enter expression:");
060     Scanner scanner=new Scanner(Wiki.in);
061     scanner.useDelimiter("\n");
062     String expression=scanner.next();
063 
064     Stack<Double> numbers=new Stack<Double>();
065     Stack<Character> operators=new Stack<Character>();
066     StringTokenizer tokenizer=new StringTokenizer(expression, "*/+-"true);
067     while(tokenizer.hasMoreElements())
068     {
069       String element=tokenizer.nextToken();
070       element=element.trim();
071       Wiki.out.println("Element: "+element);
072       try
073       {
074         double x=Double.parseDouble(element);
075         numbers.push(x);
076       }
077       catch(NumberFormatException nfe)
078       {
079         char operator=element.charAt(0);
080         if(operators.size()>0)
081         {
082 
083           char onTop=operators.peek();
084           //boolean higherPrecedence=precedenceNondecreasing(operator, onTop);
085           if(operator=='-' || operator=='+')
086           {
087             operators.pop();
088             double first=numbers.pop();
089             double second=numbers.pop();
090             if(onTop=='+'numbers.push(first+second);
091             if(onTop=='-'numbers.push(second-first);
092             if(onTop=='*'numbers.push(first*second);
093             if(onTop=='/'numbers.push(second/first);
094           }
095 
096         }
097         operators.push(operator);
098       }
099       Wiki.out.println("Operators "+getStackText(operators));
100       Wiki.out.println("Numbers   "+getStackText(numbers));
101     }
102     while(operators.size()>0)
103     {
104       char onTop=operators.pop();
105       double first=numbers.pop();
106       double second=numbers.pop();
107       if(onTop=='+'numbers.push(first+second);
108       if(onTop=='-'numbers.push(second-first);
109       if(onTop=='*'numbers.push(first*second);
110       if(onTop=='/'numbers.push(second/first);
111       Wiki.out.println("Operators "+getStackText(operators));
112       Wiki.out.println("Numbers   "+getStackText(numbers));
113     }
114     //String innerMost=getInnerMostExpression(expression);
115     double result=numbers.pop();
116 
117     Wiki.out.println("Result is "+result);
118   }
119 
120   private static boolean precedenceNondecreasing(char operator, char onTop)
121   {
122     if(onTop=='*' || onTop=='/' || operator=='+|| operator=='-')
123       return true;
124     return false;
125   }
126 
127 }


Download/View intermediate/StackCalculator.java





Views
Personal tools
Add to 
del.icio.usAdd to 
diggAdd to 
FacebookAdd to 
favoritesAdd to 
GoogleAdd to 
MySpaceAdd to 
PrintAdd to 
SlashdotAdd to 
StumbleUponAdd to 
Twitter