2014-02-26 3 views
1

나는 특히 4 입력 유형 = "숫자"를 소유하고 있습니다.검색 문자열 사업자 계산기에서 자바 스크립트

<input type = "text" id = "exp" readonly> 

숫자와 연산자는 정상적인 버튼을 통과했습니다. 예를 들어, 텍스트 상자에 삽입 된 표현식은 다음과 같습니다. 8 * 5-9/2 + 3

이제 고객이 부여한 우선 순위에 따라 등호 키를 누를 때 피연산자, 표현식 결과가 변경되었습니다.

승산 1
분할 4
감산 2
추 3

-> 40 - 9/2 + 3 
-> 31/2 + 3 
-> 31/5 
-> = 6.2 

I이 달성하기 매우 어렵다고 생각. 텍스트 상자의 값을 가져 와서 피연산자의 우선 순위에 따라 결과를 평가하는 것이 실제로 극단적입니다. 너는 무엇을 제안 하는가?

답변

0

split있어서 사용 시도 : 먼저 우선적으로 오퍼레이터에 http://msdn.microsoft.com/en-us/library/t5az126b(v=vs.94).aspx

스플릿 다음 번째 조작자에 의해 나누어 각각의 서브 그룹에 대한 다음 번째 조작자가 각각의 그룹을 분할하고, 그 서브마다 - 하위 그룹은 네 번째로 나뉩니다. 그런 다음 조작자를 위쪽으로 움직이는 그룹에 적용하십시오.

개념 예 (당신이 필요합니다,하지만 아이디어를 제공해서는 안 전체 코드) :

var expression = "8*5-9/2+3"; // Get this from the data 
var operator1Groups = expression.split("*"); // Instead of hardcoding this, retrieve which operator has highest priority from the data 
for (var i in operator1Groups) { 
    var operator2Groups = operator1Groups[i].split("+"); // Similarly, don't hardcode the operator 
    // And so on... 
    // Once you get to the lowest operator, start applying the operator to each group 
} 
+0

우선 순위가 동일한 두 명의 연산자는 어떻게 처리할까요? –

+0

OP는 두 운영자가 같은 우선 순위를 가질 수 있다고 말하지 않았습니다. 그러나 여전히 작동 할 것입니다. 이 경우 여러 분리 문자로 분리 할 수 ​​있습니다. 여기에 한 가지 방법은 다음과 http://stackoverflow.com/questions/19313541/split-a-string-based-on-multiple-delimiters – mayabelle

+0

I이 배열 생성 : VAR 배열 = '+', '-', '* ','/ ']; 하지만 코드가 어떻게 작동하는지 이해할 수 없지만 이전에 입력 한 사양의 실용적인 예제를 제공 할 수 있습니까? – user3344186

0

이 작업을 수행하는 방법은 Operator Precedence Parser 함께. 일반적으로 Djikstra의 Shunting-yard Algorithm을 사용하여 구현됩니다.

function parse(inputExpression, operators) { 
    // Strip out anything that isn't a number or a math operator 
    var tokens = inputExpression 
       .replace(/[^0-9+\-*\/()]/g, '') 
       .split(/([+\-*\/()])/) 
       .filter(function(x) { return x != ""; }); 

    var outputQ = []; // push = push, pop = pop 
    var operStk = []; // enqueue = push, dequeue = shift 

    function top(stack) { return stack[stack.length-1]; } 

    while(tokens.length !== 0) { 
     var token = tokens.shift(); 
     if(!isNaN(Number(token))) { 
      outputQ.push(token); 
     } else if (operators.hasOwnProperty(token)) { 
      while(operators[token] >= operators[top(operStk)]) 
       outputQ.push(operStk.pop()); 
      operStk.push(token); 
     } else if (token == '(') { 
      operStk.push(token); 
     } else if (token == ')') { 
      while(top(operStk) != '(' && operStk.length != 0) 
       outputQ.push(operStk.pop()); 

      if(operStk.length == 0) 
       return null; 

      operStk.pop(); // Get rid of the l-paren 
     } else { 
      console.log("Bad token '" + token + "'"); 
      return null; 
     } 
    } 

    while(operStk.length > 0) 
     outputQ.push(operStk.pop()); 

    return outputQ; 
} 

function evaluate(parseResult) { 
    if (parseResult === null) return null; 

    var valueStack = []; 
    while(parseResult.length !== 0) { 
     var op = parseResult.shift(); 
     if(!isNaN(Number(op))) 
      valueStack.push(Number(op)); 
     else { 
      var val2 = valueStack.pop(); 
      var val1 = valueStack.pop(); 
      if(op == '+') { 
       valueStack.push(val1 + val2); 
      } else if(op == '-') { 
       valueStack.push(val1 - val2); 
      } else if(op == '*') { 
       valueStack.push(val1 * val2); 
      } else if(op == '/') { 
       valueStack.push(val1/val2); 
      } else { 
       console.log("Invalid operator '" + op + "'"); 
       return null; 
      } 
     } 
    } 

    if(valueStack.length !== 1) { 
     console.log("Invalid stack. Remaining: " + valueStack); 
     return null; 
    } 

    return valueStack.pop(); 
} 

사용법 :

var operators = { 
    "+": 3, 
    "-": 2, 
    "*": 1, 
    "/": 4 
}; 
evaluate(parse("40 - 9/2 + 3", operators)); // == 6.2 

참고이 것 하지 핸들 단항 마이너스, 그것은 어렵 기 때문에 것을 당신은 알고리즘을 목록으로 사업자와 우선 순위를 가지고 있기를로드 한 후 실행하여 우선 순위를 지정할 수 있습니다 Shunting-yard와 관련이 있으며, 우선 순위를 요구하지 않기 때문입니다. 밝은면에서는 괄호를 지원합니다.

희망이 도움이됩니다.

알렉스

+0

문제는 텍스트 상자에서 표현식을 읽어야한다는 것입니다. 4 개의 루프를 만드는 것이 유용 할 것이라고 생각했습니다. 각 루프는 사용자가 입력 한 우선 순위를 둘러싸고 있습니다. 그래서 벡터의 요소를 정렬합니다. 훨씬 간단하다고 생각합니다. 내가 지어 주길 도와 줘? – user3344186

+0

필자는 연습 문제로 남겨 두겠다. 텍스트 상자/양식 필드 값을 읽을 수있는 좋은 자료를 보려면 jQuery 문서를 보라. –