자 바스 크 립 트 데이터 구조 에서 창고 의 응용 표현 식 값 구하 기 문제 상세 설명

본 고의 실례 는 자 바스 크 립 트 데이터 구조 에서 창고 의 응용 표현 식 값 구하 기 문 제 를 다 루 었 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
다음은 비교적 전형 적 인 표현 식 의 값 을 구 하 는 문 제 를 이야기 하 겠 습 니 다.이 문 제 는 주로 연산 자의 우선 순위 로 설계 되 었 습 니 다.우리 가 흔히 볼 수 있 는 표현 식 은 모두 접두사 표현 식 으로 많은 우선 순위 차이 가 존재 하지만 접두사 표현 식 은 이러한 우선 순위 문제 가 없습니다.다음은 두 표현 식 의 차 이 를 살 펴 보 겠 습 니 다.
     접미사 표현 식:a*b+c*d-e/f
     접미사 표현 식:ab*cd*+ef/-
접미사 표현 식 에서 접미사 표현 식 으로 전환 하 는 것 은 실현 하기 어렵 습 니 다.우 리 는 스 택 의 사상 을 통 해 이 루어 질 수 있 습 니 다.다음은 어떤 사상 인지 상세 하 게 소개 한다.
접두사 표시 식 을 변환 할 때 조작 되 지 않 은 문 자 를 만나면 접두사 표시 식 저장 공간 에 직접 저장 합 니 다.
만 나 야 팝 업 됩 니 다.
만 났 을 때,(이전의 조작 자 를 모두 팝 업 하고 저장 공간 에 저장 합 니 다.
*와/이렇게 우선 순위 가 높 은 것 을 만나면 스 택 의 연산 자 우선 순위 가 현재 연산 자 보다 낮 은 지 판단 합 니 다.
스 택 에서 만 나 는 것 이 낮 으 면 만 나 는 것 을 계속 스 택 에 들 어 갑 니 다.창고 의 높이 가 높 으 면 창고 의 출고 를 만 나 창고 에 들어간다.
마지막 으로 문자열 이 옮 겨 다 닐 때 연산 자 를 순서대로 꺼 내 저장 공간 에 저장 합 니 다.
이해 하기 편 하도록 위의 예 를 다시 한번 설명 하 겠 습 니 다.a*b+c*d-e/f
우선 ab 가 저장 공간 에 저 장 된 다음*스 택 에 들 어 갑 니 다.지금 창고 에*밖 에 없어 요.
+를 만난 후에*비+우선 순위 가 높 기 때문에*스 택 에서 나 오고+스 택 에 들 어가 면 저장 공간 이 ab*이 되 고 스 택 에서+가 됩 니 다.
그 다음 에 c 를 만나면 저장 공간 이 ab*c 로 바 뀌 고 스 택 에 있 습 니까?아니면+입 니까?
그 다음 에*와 d 를 만 났 습 니 다.+비*가 낮 기 때문에*계속 스 택 에 들 어 갑 니 다.스 택 의 표 는+*이 고 저장 공간 은 ab*cd 입 니 다.
그 후에 만 났 습 니 다-,*비-높 기 때문에+*스 택 나 가기,-스 택 에 들 어가 면 저장 공간 이 ab*cd*+로 변 합 니 다.
...................................................................
자 바스 크 립 트 코드 로 구현 해 보 겠 습 니 다.

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title></title>
 </head>
 <body>
<script type="text/javascript">
 function midTOLast(a){
  var a_len=a.length;
  var myArray=new Array();
  b='';
  for(var i=0;i<a_len;i++){
   switch (a[i]){
    case '(':
    {
     myArray.push(a[i]);
     break;
    }
    case ')'://   )              
    {
     if(myArray.length==0){
      return false;
     }
     temp=myArray.pop();//  ,    
     while(temp!='('){//       ,     
      b+=temp;//          
      if(myArray.length==0){//     
       break;
      }
      temp=myArray.pop();
     }
     break;
    }
    case '*':
    case '/':
    {
     if(myArray.length==0){//          
      myArray.push(a[i]);
     }else{
      temp=myArray[myArray.length-1];
      if(temp=='+'||temp=='-'){//      ,        
       myArray.push(a[i]);//     
      }
     }
     break;
    }
    case '+':
    case '-':
    {
     if(myArray.length==0){//          
      myArray.push(a[i]);
     }else{
      temp=myArray[myArray.length-1];
      if(temp=='/'||temp=='*'){//      ,      ,     
       while(myArray.length!=0){
        temp=myArray.pop();//     
        b+=temp;//       
       }
       myArray.push(a[i]);//     
      }
     }
     break;
    }
    default:
    {
     b+=a[i];
     break;
    }
   }
  }
  //             
  while(myArray.length!=0){
   temp=myArray.pop();
   b+=temp;
  }
  return true;
 }
 var x="a*b+c*d-e/f";
 midTOLast(x);
 alert(b);//ab*cd*+ef/-
</script>
 </body>
</html>

물론 상기 프로그램 에는 약간의 버그 가 존재 하지만,사상 은 반드시 이와 같 아야 한다.
다음은 접미사 표현 식 을 통 해 표현 식 의 결 과 를 계산 하 는 방법 을 설명 하 겠 습 니 다.
그렇다면 접미사 표현 식 을 접미사 표현 식 으로 바 꾼 후 어떻게 계속 계산 합 니까?아니면 이 예 를 들 면
     접미사 표현 식:a*b+c*d-e/f
     접미사 표현 식:ab*cd*+ef/-
기본 적 인 사고방식 은 다음 과 같다.
접미사 표현 식 을 옮 겨 다 니 며 비 연산 자 문 자 를 만나면 바로 스 택 에 들 어가 고 연산 자 를 만나면 스 택 두 요 소 를 나 와 대응 하 는 작업 을 한 다음 에 얻 은 결 과 를 다시 스 택 에 들 어 갑 니 다.이 스 택 에 저 장 된 값 은 현재 표현 식 의 값 입 니 다.
실 현 된 JavaScript 코드 는 다음 과 같 습 니 다.

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title></title>
 </head>
 <body>
<script type="text/javascript">
 function getValue(a){
  var a_len=a.length,
   myArray=new Array();
   for(var i=0;i<a_len;i++){
    switch (a[i])
    {//         
     case '0':
     case '1':
     case '2':
     case '3':
     case '4':
     case '5':
     case '6':
     case '7':
     case '8':
     case '9':
     {
      myArray.push(a[i]);
      break;
     }
     case '+':
     {//                  
      temp=myArray.pop()+myArray.pop();
      myArray.push(temp);//      
      temp=null;
      break;
     }
     case '-':
     {
      s=myArray.pop();
      temp=myArray.pop()-s;
      myArray.push(temp);
      s=null;temp=null;
      break;
     }
     case '*':
     {
      temp=myArray.pop()*myArray.pop();
      myArray.push(temp);//      
      temp=null;
      break;
     }
     case '/':
     {
      s=myArray.pop();
      temp=myArray.pop()/s;
      myArray.push(temp);
      s=null;temp=null;
      break;
     }
    }
   }
   return myArray.pop();//    
 }
 var a="12*34*+36/-";//1*2+3*4-3/6
 var b=getValue(a);//13.5
 alert(b);
</script>
 </body>
</html>

자,스 택 의 응용 장면 이 아직도 많 습 니 다.예 를 들 어 진법 의 전환,행 편집 프로그램,미로 풀이 등 입 니 다.여 기 는 일일이 소개 하지 않 겠 습 니 다.
자 바스 크 립 트 와 관련 된 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.,,,JavaScript 데이터 구조 와 알고리즘 기술 총화,JavaScript 수학 연산 용법 총화,JavaScript 정렬 알고리즘 요약,JavaScript 스 트 리밍 알고리즘 및 기술 총화JavaScript 찾기 알고리즘 기술 총화.
본 고 에서 말 한 것 이 여러분 의 자 바스 크 립 트 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기