<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#############################################################################
#
#	Script:		infix-postfix.pl
#	Author:		Premshree Pillai
#	Description:	Using this script you can :
#			- Convert an Infix expression to Postfix
#			- Convert a Postfix expression to Infix
#			- Evaluate a Postfix expression
#			- Evaluate an Infix expression
#	Web:		http://www.qiksearch.com
#	E-mail:		qiksearch@rediffmail.com
#	Created:	23/09/02 (dd/mm/yy)
#
#	© 2002 Premshree Pillai. All rights reserved.
#
############################################################################

sub init
{
	@string=split(/&amp;/,$ENV{QUERY_STRING});
	@exp=split(/=/,$string[0]);
	$expression=$exp[1];
	# Convert the HTML encoding
	$expression =~ tr/+/ /;
	$expression =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$expression =~ s/&lt;!--(.|\n)*--&gt;//g;
	# Convert HTML stuff as necessary.
	$expression =~ s/&lt;([^&gt;]|\n)*&gt;//g;
	@act=split(/=/,$string[1]);
	$action=$act[1];
}
init();

print '&lt;html&gt;&lt;head&gt;&lt;title&gt;Infix-Postfix&lt;/title&gt;';
print '&lt;style type="text/css"&gt;';
print '.header{font-family:Courier New,Times New Roman,verdana,arial,helvetica; font-size:30pt; font-weight:bold; font-style:italic}';
print '.main{border:#000000 solid 1px; background:#EEEEEE}';
print '.ip{border:#000000 solid 1px; height:22px}';
print '.slct{border:#000000 solid 1px; height:22px}';
print '.btn{border:#000000 solid 1px; height:22px; cursor:hand}';
print '.op{font-family:verdana,arial,helvetica; font-size:10pt; font-weight:bold; background:#EEEEEE; border:#000000 solid 1px; padding:3px}';
print '.content{font-family:verdana,arial,helvetica; font-size:10pt}';
print '.link{font-family:verdana,arial,helvetica; font-size:8pt; color:#000000}';
print '.link:hover{font-family:verdana,arial,helvetica; font-size:8pt; color:#666666}';
print '&lt;/style&gt;';
print '&lt;/head&gt;&lt;body bgcolor="#FFFFFF"&gt;';
print '&lt;table align="center"&gt;&lt;tr&gt;&lt;td&gt;';
print '&lt;span class="header"&gt;Infix-Postfix&lt;/span&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;';
print '&lt;table class="main"&gt;&lt;form method="get" action="infix-postfix.pl"&gt;&lt;tr&gt;&lt;td&gt;';
print '&lt;input type="text" name="expression" value="',$expression,'" class="ip" onClick="this.select();"&gt;';
print ' &lt;select name="action" class="slct"&gt;&lt;option value="0"&gt;Infix to Postfix&lt;/option&gt;&lt;option value="1"&gt;Postfix to Infix&lt;/option&gt;&lt;option value="2"&gt;Evaluate Postfix&lt;/option&gt;&lt;option value="3"&gt;Evaluate Infix&lt;/option&gt;&lt;/select&gt;';
print ' &lt;input type="submit" class="btn"&gt;';
print '&lt;/td&gt;&lt;/tr&gt;&lt;/form&gt;&lt;/table&gt;&lt;br&gt;';

print '&lt;script languge="JavaScript"&gt;document.forms[0].action.selectedIndex="',$action,'";&lt;/script&gt;';

print '&lt;span class="content"&gt;';

if(($exp[0] ne 'expression') || ($act[0] ne 'action'))
{
	print "&lt;i&gt;Please use the above form!&lt;/i&gt;";
}
else
{
	if(!(($action eq '0') || ($action eq '1') || ($action eq '2') || ($action eq '3')))
	{
		print "&lt;i&gt;Invalid Argument for Action";
	}
	else
	{
		print '&lt;b&gt;';
		if($action eq '0')
		{
			print 'Postfix Expression : &lt;span class="op"&gt;',InfixToPostfix($expression),'&lt;/span&gt;';
		}
		if($action eq '1')
		{
			print 'Infix Expression : &lt;span class="op"&gt;',PostfixToInfix($expression),'&lt;/span&gt;';
		}
		if($action eq '2')
		{
			print 'Postfix Eval : &lt;span class="op"&gt;',PostfixEval($expression),'&lt;/span&gt;';
		}
		if($action eq '3')
		{
			print 'Infix Eval : &lt;span class="op"&gt;',eval($expression),'&lt;/span&gt;';
		}
		print '&lt;/b&gt;';
	}
}

print '&lt;br&gt;&lt;br&gt;&lt;b&gt;Algorithms used &amp;raquo;&lt;/b&gt;&lt;ul type="square"&gt;&lt;li&gt;&lt;a href="http://www.qiksearch.com/articles/cs/infix-postfix/index.htm" class="link"&gt;Infix to Postfix Conversion&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.qiksearch.com/articles/cs/postfix-evaluation/index.htm" class="link"&gt;Postfix Evaluation&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;';
print '&amp;#169; 2002 Premshree Pillai.';
print '&lt;br&gt;&lt;a href="http://pub.alxnet.com/guestbook?id=2395118" class="link"&gt;Sign my Guestbook&lt;/a&gt; | &lt;a href="http://www.qiksearch.com" class="link"&gt;Qiksearch.com&lt;/a&gt;';
print '&lt;/span&gt;';
print '&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;';
print '&lt;/body&gt;&lt;/html&gt;';

sub isOperand
{
	($who)=@_;
	if((!isOperator($who)) &amp;&amp; ($who ne "(") &amp;&amp; ($who ne ")"))
	{
		return 1;
	}
	else
	{
		return;
	}
}

sub isOperator
{
	($who)=@_;
	if(($who eq "+") || ($who eq "-") || ($who eq "*") || ($who eq "/") || ($who eq "^"))
	{
		return 1;
	}
	else
	{
		return;
	}
}

sub topStack
{
	(@arr)=@_;
	my $arr_len=@arr;
	return($arr[$arr_len-1]);
}

sub isEmpty
{
	(@arr)=@_;
	my $arr_len=@arr;
	if(($arr_len)==0)
	{
		return 1;
	}
	else
	{
		return;
	}
}

sub prcd
{
	($who)=@_;
	my $retVal;
	if($who eq "^")
	{
		$retVal="5";
	}
	elsif(($who eq "*") || ($who eq "/"))
	{
		$retVal="4";
	}
	elsif(($who eq "+") || ($who eq "-"))
	{
		$retVal="3";
	}
	elsif($who eq "(")
	{
		$retVal="2";
	}
	else
	{
		$retVal="1";
	}
	return($retVal);
}

sub genArr
{
	($who)=@_;
	my @whoArr;
	for($i=0; $i&lt;length($who); $i++)
	{
		$whoArr[$i]=substr($who,$i,1);
	}
	return(@whoArr);
}

sub InfixToPostfix
{
	($infixStr)=@_;
	my @infixArr=genArr($infixStr);
	my @postfixArr;
	my @stackArr;
	my $postfixPtr=0;
	for($i=0; $i&lt;length($infixStr); $i++)
	{
		if(isOperand($infixArr[$i]))
		{
			$postfixArr[$postfixPtr]=$infixArr[$i];
			$postfixPtr++;
		}
		if(isOperator($infixArr[$i]))
		{
			if($infixArr[$i] ne "^")
			{
				while((!isEmpty(@stackArr)) &amp;&amp; (prcd($infixArr[$i])&lt;=prcd(topStack(@stackArr))))
				{
					$postfixArr[$postfixPtr]=topStack(@stackArr);
					pop(@stackArr);
					$postfixPtr++;
				}
			}
			else
			{
				while((!isEmpty(@stackArr)) &amp;&amp; (prcd($infixArr[$i])&lt;prcd(topStack(@stackArr))))
				{
					$postfixArr[$postfixPtr]=topStack(@stackArr);
					pop(@stackArr);
					$postfixPtr++;
				}
			}
			push(@stackArr,$infixArr[$i]);
		}
		if($infixArr[$i] eq "(")
		{
			push(@stackArr,$infixArr[$i])
		}
		if($infixArr[$i] eq ")")
		{
			while(topStack(@stackArr) ne "(")
			{
				$postfixArr[$postfixPtr]=pop(@stackArr);
				$postfixPtr++;
			}
			pop(@stackArr);
		}
	}
	while(!isEmpty(@stackArr))
	{
		if(topStack(@stackArr) eq "(")
		{
			pop(@stackArr)
		}
		else
		{
			$temp=@postfixArr;
			$postfixArr[$temp]=pop(@stackArr);
		}
	}
	return(@postfixArr);
}

sub PostfixToInfix
{
	($postfixStr)=@_;
	my @stackArr;
	my @postfixArr=genArr($postfixStr);
	for($i=0; $i&lt;length($postfixStr); $i++)
	{
		if(isOperand($postfixArr[$i]))
		{
			push(@stackArr,$postfixArr[$i]);
		}
		else
		{
			$temp=topStack(@stackArr);
			pop(@stackArr);
			$pushVal=topStack(@stackArr).$postfixArr[$i].$temp;
			pop(@stackArr);
			push(@stackArr,$pushVal);
		}
	}
	return((@stackArr));
}

sub PostfixEval
{
	($postfixStr)=@_;
	my @stackArr;
	my @postfixArr=genArr($postfixStr);
	for($i=0; $i&lt;length($postfixStr); $i++)
	{
		if(isOperand($postfixArr[$i]))
		{
			push(@stackArr,$postfixArr[$i]);
		}
		else
		{
			$temp=topStack(@stackArr);
			pop(@stackArr);
			$pushVal=PostfixSubEval(topStack(@stackArr),$temp,$postfixArr[$i]);
			pop(@stackArr);
			push(@stackArr,$pushVal);
		}
	}
	return(topStack(@stackArr));
}

sub PostfixSubEval
{
	($num1,$num2,$sym)=@_;
	my $returnVal;
	if($sym eq "+")
	{
		$returnVal=$num1+$num2;
	}
	if($sym eq "-")
	{
		$returnVal=$num1-$num2;
	}
	if($sym eq "*")
	{
		$returnVal=$num1*$num2;
	}
	if($sym eq "/")
	{
		$returnVal=$num1/$num2;
	}
	if($sym eq "^")
	{
		$returnVal=$num1**$num2;
	}
	return($returnVal);
}

sub joinArr
{
	(@who)=@_;
	my $who_len=@who;
	my $retVal;
	for($i=0; $i&lt;$who_len; $i++)
	{
		$retVal.=$who[$i];
	}
	return $retVal;
}

sub evalInfix
{
	($exp)=@_;
	return PostfixEval(joinArr(InfixToPostfix($exp)));
}</pre></body></html>