xxxxxxxxxx
// Kotlin program for
// Infix to postfix conversion
// Using custom stack
// Stack node
class StackNode
{
// Stack data
var element: Char;
var next: StackNode ? ;
constructor(element: Char, next: StackNode ? )
{
this.element = element;
this.next = next;
}
}
// Define a custom stack
class MyStack
{
var top: StackNode ? ;
var size: Int;
constructor()
{
this.top = null;
this.size = 0;
}
// Add node at the top of stack
fun push(element: Char): Unit
{
this.top = StackNode(element, this.top);
this.size += 1;
}
fun isEmpty(): Boolean
{
if (this.size > 0 && this.top != null)
{
return false;
}
else
{
return true;
}
}
// Remove top element of stack
fun pop(): Unit
{
if (this.size > 0 && this.top != null)
{
// Change top element of stack
this.top = this.top!!.next;
this.size -= 1;
}
}
// Return top element of stack
fun peek(): Char
{
if (this.top == null)
{
return ' ';
}
return this.top!!.element;
}
}
class Conversion
{
fun precedence(text: Char): Int
{
if (text == '+' || text == '-')
{
return 1;
}
else if (text == '*' || text == '/')
{
return 2;
}
else if (text == '^')
{
return 3;
}
return -1;
}
fun is_operator(text: Char): Boolean
{
if (text == '+' || text == '-' ||
text == '*' || text == '/' || text == '^')
{
return true;
}
return false;
}
// Converting the given infix expression to postfix expression
fun infixToPostfix(infix: String): Unit
{
var result: String = "";
// Get the size
val size: Int = infix.length;
// Create empty stack
val s: MyStack = MyStack();
var i: Int = 0;
while (i < size)
{
if ((infix.get(i) >= '0' &&
infix.get(i) <= '9') ||
(infix.get(i) >= 'a' && infix.get(i) <= 'z') ||
(infix.get(i) >= 'A' && infix.get(i) <= 'Z'))
{
// When getting a operands
result = result + infix.get(i).toString();
}
else
{
if (s.isEmpty() || infix.get(i) == '(')
{
// Base case
// When getting a open parenthesis
// Or stack is empty
s.push(infix.get(i));
}
else if (infix.get(i) == ')')
{
// Need to remove stack element until the close bracket
while (s.isEmpty() == false && s.peek() != '(')
{
// Get top element
result += s.peek();
// Remove stack element
s.pop();
}
if (s.peek() == '(')
{
// Remove stack element
s.pop();
}
}
else
{
// Remove stack element until precedence of
// top is greater than current infix operator
while (s.isEmpty() == false && this.precedence(infix.get(i)) <= this.precedence(s.peek()))
{
// Get top element
result += s.peek();
// Remove stack element
s.pop();
}
// Add new operator
s.push(infix.get(i));
}
}
i += 1;
}
// Add remaining elements
while (s.isEmpty() == false)
{
result += s.peek();
s.pop();
}
// Display result
println(" Infix : " + infix);
println(" Postfix : " + result);
}
}
fun main(args: Array < String > ): Unit
{
val task: Conversion = Conversion();
var infix: String = "((a/b+c))/(e*f)+(g^h-i)+k";
task.infixToPostfix(infix);
infix = "((a*b)^(c+d)/e)-f";
task.infixToPostfix(infix);
}