코드를 작성할 때, 우리는 때때로 우리가 스스로 4 가지 산술 표현을 구문 분석 해야하는 상황에 직면합니다. 이 기사는 간단한 4 개의 산술 표현의 구문 분석을 구현하기 위해 JavaScript를 사용하는 것을 간략하게 소개합니다.
1. 개념에 익숙합니다
Infix 표기법 (또는 Infix 표기법)은 일반적인 산술 또는 논리 공식 표현 방법입니다. 연산자는 피연산자 중간에 디픽스 형태로 있습니다 (예 : 3 + 4). 즉, 우리는 가장 일반적으로 사용되는 산술 표현을 사용합니다. 인간이 이해하기 쉽지만 컴퓨터 분석에는 쉽지 않습니다.
리버스 폴란드 표기법 (RPN 또는 역 광택 표기법)은 1920 년 폴란드 수학자 Jan Vukasevich가 도입 한 수학적 표현 방법입니다. 반대 광택 표기법에서는 모든 연산자가 오페라 뒤에 배치되므로 접미사 표기법이라고도합니다. 역 광택 표기법은 작업자 우선 순위를 식별하기 위해 브래킷이 필요하지 않습니다. 역 광 폴란드 표기법은 표현을 구문 분석하고 계산하기 위해 스택 구조를 사용하기 쉽습니다. 따라서 4 가지 요소 표현식을 구문 분석하는데, 이는 먼저 디픽스 표현식에서 역 광택 표현식으로 변환됩니다. 그런 다음 값을 계산하십시오.
2. 변환 과정
접미사 표현식으로 디픽스 표현식을 변환 (필드 알고리즘 스케줄링)
1. 대기열을 입력하고 마크를 팝업하십시오
2. 마크가 숫자 인 경우 출력 대기열에 추가하십시오.
3. 연산자 (+-*/) 인 경우 출력 스택의 스택 상단에있는 연산자와 비교하십시오. 우선 순위가 스택 상단의 연산자보다 작거나 동일하다면 스택 상단의 연산자를 팝업하여 출력 대기열에 추가하고 (위 조건이 충족되지 않을 때까지 루프) 작업자를 스택으로 밀어 넣으십시오.
4. 왼쪽 브래킷 인 경우 스택에 밀어 넣습니다.
5. 튼튼한 괄호 인 경우, 연산자는 스택에서 지속적으로 튀어 나와 출력 대기열에 추가되며 스택 상단의 요소가 왼쪽 브래킷임을 알고 있습니다. 왼쪽 브래킷이 팝업되어 출력 대기열을 추가하지 않습니다. 왼쪽 괄호가 발견되지 않으면 원래 표현식의 괄호가 비대칭이고 오류가 있음을 의미합니다.
6. 입력 큐가 비어 있고 스택에 여전히 연산자가있는 경우 스택 상단의 연산자가 왼쪽 브래킷이 있으면 원래 표현식에 괄호가 일치하지 않음을 의미합니다. 스택의 연산자를 하나씩 팝업하여 출력 대기열에 추가하십시오.
7. 완료
3. 코드 구현을 변환합니다
함수 isoperator (value) {var operatorstring = "+-*/()"; return operatorstring.indexof (value)> -1} 함수 getPrioraty (value) {value (value) {case '+': case '-': case '*': case '/': return 2; return : return 0;}} 함수 우선 순위 (o1, o2). <= getPrioraty (o2);} 함수 dal2rpn (exp) {var inputStack = []; var outputStack = []; var outputqueue = []; for (var i = 0, len = exp.length; i <len; i ++) {var cu = exp [i]; if (cur! = '' ' ) {inputStack.push (cur);}} console.log ( '단계 1'); while (inputstack.length> 0) {var cur = inputStack.shift (); if (isoperator (cur)) {if (cur == '(') {outputStack.push (cur);} else (cur == ')') {var po = outputStack.pop (); while (po! = '('&& outputStack.length> 0) {outputqueue.push (po); po = outputStack.pop ();} if (po! = '(') {trash "error : unmatched ()";}} else {while (puripaty (cur, outputstack [outputStack.length.length -1])). 0) {outputqueue.push (outputStack.pop ());} outputStack.push (cur);}} else {outputqueue.push (새 번호 (cur)); outputStack [outputStack.length -1] == '(') {Throw "ERROR : nimatched ()";} while (outputStack.length> 0) {outputqueue.push (outputStack.pop ());}} console.log ( 'step 3'); return outputqueue;} console.log. 2 ')); console.log (dal2rpn ('1 + 2 + 3 ')); console.log (dal2rpn ('1 + 2 * 3 ')); console.log (dal2rpn ('1 + 2 * 3-4 / 5 ')); console.log (dal2rpn ('(1 + 2)) '); 2) * (3-4) / 5 '); console.log (dal2rpn ('(1 + 2) *) * ((3-4) / 5) ');4. 역 광 폴란드 표현 평가
1. 입력 큐에서 마크를 팝업하십시오
2. 피연산자 인 경우 출력 스택에 추가하십시오.
3. 연산자 인 경우 출력 스택에서 2 개의 피연산자를 팝업하여 계산하고 계산 된 값을 출력 스택으로 밀어 넣습니다.
4. 루프 작동. 입력 큐가 비어 있고 출력 스택에 숫자가 하나만 있으면이 숫자는 결과입니다. 그렇지 않으면 불필요한 피연산자가 있습니다.
5. 코드를 계산하십시오
function evalrpn (rpnqueue) {var outputStack = []; while (rpnqueue.length> 0) {var cur = rpnqueue.shift (); if (! isoperator (cur)) {outputStack.push (cur);} else {if (outputstack.length <2) {var sec = " outputStack.pop (); var fir = outputStack.pop (); outputStack.push (getResult (fir, sec, cur));}} if (outputStack.length! = 1) {} else {return outputStack [0];}}6. 결론
역 광 폴란드 표현은 처음 접촉 할 때 사용되지 않지만, 익숙해지면 다양한 우선 순위가있는 디스 픽스 표현과 달리 아이디어가 실제로 매우 간단하다는 것을 알게 될 것입니다. 역 광 폴란드 표현은 비교적 간결하며 우선 순위를 전혀 고려할 필요가 없으며 상황을 방해하기 위해 괄호와 괄호와 괄호를 사용할 필요가 없습니다.