मैं कक्षा के लिए जावास्क्रिप्ट में शंटिंग-यार्ड एल्गोरिदम लागू करने पर काम कर रहा हूं।मैं अपने शंटिंग-यार्ड एल्गोरिदम को कैसे संशोधित कर सकता हूं ताकि यह यूनरी ऑपरेटरों को स्वीकार कर सके?
var userInput = prompt("Enter in a mathematical expression:");
var postFix = InfixToPostfix(userInput);
var result = EvaluateExpression(postFix);
document.write("Infix: " + userInput + "<br/>");
document.write("Postfix (RPN): " + postFix + "<br/>");
document.write("Result: " + result + "<br/>");
function EvaluateExpression(expression)
{
var tokens = expression.split(/([0-9]+|[*+-\/()])/);
var evalStack = [];
while (tokens.length != 0)
{
var currentToken = tokens.shift();
if (isNumber(currentToken))
{
evalStack.push(currentToken);
}
else if (isOperator(currentToken))
{
var operand1 = evalStack.pop();
var operand2 = evalStack.pop();
var result = PerformOperation(parseInt(operand1), parseInt(operand2), currentToken);
evalStack.push(result);
}
}
return evalStack.pop();
}
function PerformOperation(operand1, operand2, operator)
{
switch(operator)
{
case '+':
return operand1 + operand2;
case '-':
return operand1 - operand2;
case '*':
return operand1 * operand2;
case '/':
return operand1/operand2;
default:
return;
}
}
function InfixToPostfix(expression)
{
var tokens = expression.split(/([0-9]+|[*+-\/()])/);
var outputQueue = [];
var operatorStack = [];
while (tokens.length != 0)
{
var currentToken = tokens.shift();
if (isNumber(currentToken))
{
outputQueue.push(currentToken);
}
else if (isOperator(currentToken))
{
while ((getAssociativity(currentToken) == 'left' &&
getPrecedence(currentToken) <= getPrecedence(operatorStack[operatorStack.length-1])) ||
(getAssociativity(currentToken) == 'right' &&
getPrecedence(currentToken) < getPrecedence(operatorStack[operatorStack.length-1])))
{
outputQueue.push(operatorStack.pop())
}
operatorStack.push(currentToken);
}
else if (currentToken == '(')
{
operatorStack.push(currentToken);
}
else if (currentToken == ')')
{
while (operatorStack[operatorStack.length-1] != '(')
{
if (operatorStack.length == 0)
throw("Parenthesis balancing error! Shame on you!");
outputQueue.push(operatorStack.pop());
}
operatorStack.pop();
}
}
while (operatorStack.length != 0)
{
if (!operatorStack[operatorStack.length-1].match(/([()])/))
outputQueue.push(operatorStack.pop());
else
throw("Parenthesis balancing error! Shame on you!");
}
return outputQueue.join(" ");
}
function isOperator(token)
{
if (!token.match(/([*+-\/])/))
return false;
else
return true;
}
function isNumber(token)
{
if (!token.match(/([0-9]+)/))
return false;
else
return true;
}
function getPrecedence(token)
{
switch (token)
{
case '^':
return 9;
case '*':
case '/':
case '%':
return 8;
case '+':
case '-':
return 6;
default:
return -1;
}
}
function getAssociativity(token)
{
switch(token)
{
case '+':
case '-':
case '*':
case '/':
return 'left';
case '^':
return 'right';
}
}
यह ठीक अब तक काम करता है:
यहाँ मेरा काम अब तक है।
((5 + 3) * 8)
यह होगा उत्पादन:
इन्फ़िक्स: ((5 + 3) * 8)
पोस्टफिक्स अगर मैं इसे देने के (आरपीएन): 5 3 + 8 *
परिणाम: 64
हालांकि, मैं एकल operato को लागू करने के साथ संघर्ष कर रहा हूँ रु इसलिए मैं कुछ ऐसा कर सकता है:
((-5 +3) * 8)
सबसे अच्छा तरीका क्या होगा एकल ऑपरेटरों (निषेध, आदि) लागू करने के लिए? साथ ही, क्या किसी के पास फ्लोटिंग पॉइंट नंबरों को संभालने के लिए कोई सुझाव है?
एक आखिरी बात, अगर कोई मुझे जावास्क्रिप्ट में अजीब कुछ भी देखता है तो मुझे बताएं। यह मेरा पहला जावास्क्रिप्ट प्रोग्राम है और मैं अभी तक इसका उपयोग नहीं कर रहा हूं।
लेकिन क्या करने के लिए एक iterator है:
यह C++ मेरी कार्यान्वयन है यदि आप पाप या वर्ग जैसे कुछ अन्य ऑपरेटर का उपयोग कर रहे हैं? यह पाप (3 + 4) जैसे कुछ करने के लिए वास्तव में मुश्किल हो सकता है। –
अच्छी तरह से हाथ की समस्या का सवाल है, यह समस्या का हिस्सा नहीं है .. :) – ultrajohn
ऐ, मैंने हाल ही में यह कार्यान्वयन किया है और यह मेरे लिए अच्छा काम करता है। – Makach