Created
September 19, 2014 11:01
-
-
Save AliZafar120/a25129d1ab4117c09638 to your computer and use it in GitHub Desktop.
Additional for extension
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Stack; | |
import java.util.Vector; | |
class Additional extends BasicCalculator { | |
private String givenstring; | |
private String substitute; | |
private Vector<Content> infix = new Vector<Content>(); | |
private Vector <Float> numbersObtained = new Vector<Float>(); | |
private Vector<Content> postFix = new Vector<Content>(); | |
Additional () | |
{ | |
} | |
Additional (String givenstring) | |
{ | |
this.givenstring = givenstring; | |
this.substitute = givenstring; | |
} | |
private class Content | |
{ | |
public float number; | |
public char symbol; | |
public boolean flag; | |
Content () | |
{ | |
} | |
} | |
public boolean lowerPrecedence(char infixSymbol , char stackSymbol) | |
{ | |
if((infixSymbol=='*'||infixSymbol=='/' || infixSymbol == '^')&&(stackSymbol=='+'||stackSymbol=='-')) return true; | |
else return false; | |
} | |
public Content makeContentWithNumber (float numberObtained) | |
{ | |
Content node = new Content(); | |
node.number = numberObtained; | |
node.flag = true; | |
return node; | |
} | |
public Content makeContentWithSymbol (char symbolFromInputStringArray) | |
{ | |
Content node = new Content(); | |
node.symbol = symbolFromInputStringArray; | |
node.flag = false; | |
return node; | |
} | |
public void parsingInput () | |
{ | |
String temp1 = substitute.replaceAll("[+^*/-]"," ").replaceAll("[()]" ,""); | |
this.substitute = substitute.replaceAll("[+^*/-]"," ").replaceAll("[()]" ," "); | |
if(temp1.charAt(0) == ' ') temp1.replaceFirst(" ", ""); | |
String [] temp = temp1.split("[ ]"); | |
for(int i = 0 ; i < temp.length ; i++){ | |
numbersObtained.add(Float.parseFloat(temp[i])); | |
} | |
for(int i=0; i<givenstring.length(); i++) | |
{ | |
if(substitute.charAt(i)== ' ') | |
{ | |
if(i != 0) | |
{ | |
if(substitute.charAt(i-1)!= ' ') | |
{ | |
Content node = new Content(); | |
node = makeContentWithNumber(numbersObtained.elementAt(0)); | |
infix.add(node); | |
numbersObtained.remove(0); | |
node = makeContentWithSymbol(givenstring.charAt(i)); | |
infix.add(node); | |
} | |
else | |
{ | |
Content node = new Content(); | |
node = makeContentWithSymbol( givenstring.charAt(i)); | |
infix.add(node); | |
} | |
} | |
else | |
{ | |
Content node = new Content(); | |
node = makeContentWithSymbol( givenstring.charAt(i)); | |
infix.add(node); | |
} | |
} | |
} | |
if(!numbersObtained.isEmpty()) | |
{ | |
Content node = new Content(); | |
node = makeContentWithNumber(numbersObtained.elementAt(0)); | |
infix.add(node); | |
numbersObtained.remove(0); | |
} | |
} | |
public void infixToPostfix() | |
{ | |
Stack <Content> myStack = new Stack<>(); | |
Content node = new Content(); | |
node = makeContentWithSymbol('('); | |
myStack.push(node); | |
node = makeContentWithSymbol( ')'); | |
infix.add(node); | |
for(int i=0; i<infix.size(); i++) | |
{ | |
if(infix.elementAt(i).flag) | |
{ | |
postFix.add(infix.elementAt(i)); | |
} | |
else | |
{ | |
if(infix.elementAt(i).symbol == '(') | |
{ | |
myStack.push(infix.elementAt(i)); | |
} | |
else if(infix.elementAt(i).symbol == ')') | |
{ | |
while(true) | |
{ | |
Content tempNode = new Content(); | |
tempNode = myStack.lastElement(); | |
if(tempNode.symbol == '(') | |
{ | |
myStack.pop(); | |
break; | |
} | |
else | |
{ | |
postFix.add(tempNode); | |
myStack.pop(); | |
} | |
} | |
} | |
else | |
{ | |
while(true) | |
{ | |
Content tempNode1 = new Content(); | |
tempNode1 = myStack.lastElement(); | |
if(lowerPrecedence(infix.elementAt(i).symbol, tempNode1.symbol)|| tempNode1.symbol == '(') break; | |
postFix.add(tempNode1); | |
myStack.pop(); | |
} | |
myStack.push(infix.elementAt(i)); | |
} | |
} | |
} | |
} | |
public float evaluatePostfix() | |
{ | |
Stack <Float> myStack = new Stack <>(); | |
for(int i=0; i<postFix.size(); i++) | |
{ | |
if(postFix.elementAt(i).flag) | |
{ | |
myStack.push(postFix.elementAt(i).number); | |
} | |
else | |
{ | |
float stackTop0, stackTop1, result; | |
stackTop0 = myStack.lastElement(); | |
myStack.pop(); | |
stackTop1 = myStack.lastElement(); | |
myStack.pop(); | |
result = evaluateBasicArithmetic(stackTop0, stackTop1, postFix.elementAt(i).symbol); | |
myStack.push(result); | |
} | |
} | |
return myStack.lastElement(); | |
} | |
public float output(){ | |
parsingInput(); | |
infixToPostfix(); | |
return evaluatePostfix(); | |
} | |
public float evaluateBasicArithmetic(float a, float b, char symbol) | |
{ | |
switch(symbol) | |
{ | |
case '+': return add(a, b); | |
case '-': return subtract(b, a); | |
case '*': return multiply(a, b); | |
case '^': return exponent(b, a); | |
default: return divide(b, a); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment