object infixAfix extends App {
import scala.collection.mutable.ListBuffer
class Stack(val stack: ListBuffer[String]) {
def isEmpty: Boolean = {
if (stack.isEmpty) true
else false
}
def push(input: String): Unit = {
stack += input
}
def pop(): String = {
stack.remove ( stack.length - 1 )
}
def peek(): String = {
stack.last
}
def length(): Int = {
stack.length
}
}
val oS = new Stack ( ListBuffer [String]( ) )
val eS: ListBuffer[String] = ListBuffer ( )
val chars: Seq[String] = (('a' to 'z') ++ ('A' to 'Z') ++ ('0' to '9')).mkString.split ( "" ).toList
val nums: Seq[String] = ('0' to '9').mkString.split ( "" ).toList
val ops: List[String] = List ( "+", "*", "/", "(", ")", "-" )
val h = "(-456*13) - ((3789/204) * -3)"
def parser(h: String): ListBuffer[String] = {
val w: ListBuffer[String] = ListBuffer ( )
for (i <- h) {
if (i.toString != " ") w += i.toString
}
for (i <- 0 until (w.length - 1)) {
if (nums contains w ( i )) {
if (nums contains w ( i + 1 )) {
w ( i + 1 ) = w ( i ) + w ( i + 1 )
}
}
}
for (i <- w.indices) {
if (w ( i ).length > 1) w ( i - 1 ) = "!"
}
for (i <- w) {
if (i == "!") w -= i
}
for (i <- 1 until w.length) {
if (w ( i - 1 ).length > 1 && !(ops contains w ( i ))) {
w ( i - 1 ) = w ( i - 1 ) + w ( i )
w ( i ) = "!"
}
}
for (i <- w.indices) {
if (i == 0) {
if (w ( i ) == "-") {
w ( i + 1 ) = w ( i ) + w ( i + 1 )
w ( i ) = "!"
}
}
if (w ( i ) == "-") {
if (w ( i - 1 ) == "(" | (ops contains w ( i - 1 )) && !(ops contains w ( i + 1 ))) {
w ( i + 1 ) = w ( i ) + w ( i + 1 )
w ( i ) = "!"
}
}
}
for (i <- w) if (i == "!") w -= i
w
}
println ( parser ( h ) )
val ops2: Seq[String] = ops.filter ( _ != ")" )
def toPostFix(w: ListBuffer[String]) {
while (w.nonEmpty) {
for (i <- w) {
i match {
case i if nums contains i =>
oS.push ( i )
w -= i
println ( oS.stack )
println ( w )
case i if ops2 contains i =>
oS.push ( i )
w -= i
println ( oS.stack )
println ( w )
case i if chars contains i =>
eS += i
w -= i
println ( oS.stack )
println ( w )
case i if i.length > 1 =>
eS += i
w -= i
println ( oS.stack )
println ( w )
case i if i == ")" =>
if (oS.peek ( ) != "(") {
eS += oS.peek ( )
oS.pop ( )
w -= i
println ( oS.stack )
println ( w )
}
case _ => null
}
}
}
}
toPostFix ( parser ( h ) )
println ( oS.stack )
println ( eS )
}