자 바스 크 립 트 데이터 구조 에서 창고 의 응용 표현 식 값 구하 기 문제 상세 설명
6635 단어 JavaScript데이터 구조창고.
다음은 비교적 전형 적 인 표현 식 의 값 을 구 하 는 문 제 를 이야기 하 겠 습 니 다.이 문 제 는 주로 연산 자의 우선 순위 로 설계 되 었 습 니 다.우리 가 흔히 볼 수 있 는 표현 식 은 모두 접두사 표현 식 으로 많은 우선 순위 차이 가 존재 하지만 접두사 표현 식 은 이러한 우선 순위 문제 가 없습니다.다음은 두 표현 식 의 차 이 를 살 펴 보 겠 습 니 다.
접미사 표현 식: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 찾기 알고리즘 기술 총화.
본 고 에서 말 한 것 이 여러분 의 자 바스 크 립 트 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.