Skip to main content

Evaluate postfix expression using stack in typescript

Ts program for Evaluate postfix expression using stack. Here problem description and explanation.

/* 
    TypeScript program for 
    Evaluate postfix expression
*/
// Stack Node
class StackNode
{
	public operand: number;
	public next: StackNode;
	constructor(operand: number, top: StackNode)
	{
		this.operand = operand;
		this.next = top;
	}
}
class MyStack
{
	public top: StackNode;
	public count: number;
	constructor()
	{
		this.top = null;
		this.count = 0;
	}
	// Returns the number of element in stack
	public number isSize()
	{
		return this.count;
	}
	public boolean isEmpty()
	{
		if (this.isSize() > 0)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	// Add a new element in stack
	public push(value: number)
	{
		// Make a new stack node
		// And set as top
		this.top = new StackNode(value, this.top);
		// Increase node value
		this.count++;
	}
	// Remove a top element 
	public number pop()
	{
		var value = this.peek();
		if (this.isEmpty() == false)
		{
			this.top = this.top.next;
			// Reduce the size
			this.count--;
		}
		return value;
	}
	// Used to get top element of stack
	public number peek()
	{
		if (!this.isEmpty())
		{
			return this.top.operand;
		}
		else
		{
			return 0;
		}
	}
}
class Execution
{
	public evaluate(e: string)
	{
		// Get the length of expression
		var size = e.length;
		var a = 0;
		var b = 0;
		var s = new MyStack();
		var isVaild = true;
		// work with (+,-,/,*,%) operator
		for (var i = 0; i < size && isVaild; i++)
		{
			if (e.charAt(i) >= '0' && e.charAt(i) <= '9')
			{
				a = parseInt(e.charAt(i)) - parseInt('0');
				s.push(a);
			}
			else if (s.isSize() > 1)
			{
				a = s.pop();
				b = s.pop();
				// Perform arithmetic operations between 2 operands
				if (e.charAt(i) == '+')
				{
					s.push(b + a);
				}
				else if (e.charAt(i) == '-')
				{
					s.push(b - a);
				}
				else if (e.charAt(i) == '*')
				{
					s.push(b * a);
				}
				else if (e.charAt(i) == '/')
				{
					s.push(parseInt(b / a));
				}
				else if (e.charAt(i) == '%')
				{
					s.push(b % a);
				}
				else
				{
					// When use other operator
					isVaild = false;
				}
			}
			else if (s.isSize() == 1)
			{
				// Special case  
				// When use +, - at the beginning
				if (e.charAt(i) == '-')
				{
					a = s.pop();
					s.push(-a);
				}
				else if (e.charAt(i) != '+')
				{
					// When not use  +,-
					isVaild = false;
				}
			}
			else
			{
				isVaild = false;
			}
		}
		if (isVaild == false)
		{
			// Possible case use other operators
			// 1) When using special operators
			// 2) Or expression is invalid
			console.log(e + " Invalid expression ");
			return;
		}
		console.log(e + " = " + s.pop());
	}
	public static main(args: string[])
	{
		var task = new Execution();
		// Execute the following expression
		// (1+2)*(3+5)
		task.evaluate("12+35+*");
		// -((7*2) + (6/2) + 4)
		task.evaluate("72*62/+4+-");
	}
}
Execution.main([]);
/*
 file : code.ts
 tsc --target es6 code.ts
 node code.js
 */

Output

12+35+* = 24
72*62/+4+- = -21




Comment

Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.

New Comment