역 폴란드 식 (접미사 식) 의 계산 & 접미사 식 접미사 식 (역 폴란드 식) [자바 구현]
7503 단어 데이터 구조
생각:
* 1.
* 2. , stack
* 3. ,stack ,num2 num1,
* 4.
* 5.
코드
들 어 오 는 역 폴란드 표현 식 은: 4 5 * 8 - 60 + 8 2 / + 접미사 식 4 * 5 - 8 + 60 + 8 / 2
결과: 76
역 폴란드 표현 식 이 역 폴란드 집합 으로 바 뀌 었 다.
/**
*
* @param express ( )
* @return
*/
public static List expressToArrayLisy(String express){
String[] split = express.split(" ");
List list = new ArrayList<>();
for (String s : split) {
list.add(s);
}
return list;
}
역 폴란드 식 계산
/**
*
* :
* 1.
* 2. , stack
* 3. ,stack ,num2 num1,
* 4.
* 5.
* stack.pop()
* @param list
* @return
*/
public static int polandCal(List list){
Stack stack = new Stack();
for (String item : list) {
// ,
if(item.matches("\\d+")){
stack.push(item);
}else{
//
Integer num2 = Integer.parseInt(stack.pop());
Integer num1 = Integer.parseInt(stack.pop());
int res = 0;
if(item.equals("+")){
res = num2 + num1;
}else if(item.equals("-")){
res = num1 - num2;
}else if(item.equals("*")){
res = num1 * num2;
}else if(item.equals("/")){
res = num1 / num2;
}else{
throw new RuntimeException(" ...");
}
stack.push(res+"");
}
}
return Integer.parseInt(stack.pop());
}
2. 접미사 식 접미사 식 (역 폴란드 식)
접미사 표현 식: 1 + ((2 + 3) * 4) - 5
접미사 식 집합: [1, +, (, (, 2, +, 3,), *, 4,), -, 5]
접미사 표현 식: [1, 2, 3, +, 4, *, +, 5, -]
접미사 식 계산 결과: 16
생각:
1. 접미사 표현 식 을 접미사 표현 식 집합 으로 전환 합 니 다.여기 서 전환 할 때 여러 비트 의 처리 에 주의 하 세 요.
2. 접두사 표현 식 을 옮 겨 다 니 며 집합 합 니 다.연산 자 스 택 stack, 결 과 를 저장 하 는 집합 list 를 준비 합 니 다.
3. 왼쪽 에서 오른쪽으로, 숫자 일 때 집합 에 추가
4. 괄호 일 때 두 가지 상황 으로 나눈다
4.1 만약 에 (왼쪽 괄호 라면 바로 창고 에 들어간다.
4.2 만약 에) 오른쪽 괄호 라면 stack 에 있 는 요 소 를 순서대로 꺼 내 list 에 넣 고 (왼쪽 괄호 를 만 날 때 까지 이 괄호 를 잃 어 버 립 니 다.
5. 연산 자 일 때 다음 과 같은 상황 으로 나 뉜 다.
5.1 stack 이 비어 있 거나 스 택 꼭대기 요소 가 (왼쪽 괄호 일 경우 스 택 에 직접 들 어 갑 니 다.
5.2 만약 에 이때 연산 자의 우선 순위 가 스 택 꼭대기 요소 연산 자의 우선 순위 보다 크 면 바로 스 택 에 들어간다.
5.3 이때 연산 자의 우선 순위 가 스 택 상단 요소 연산 자의 우선 순위 보다 작 으 면 stack 의 스 택 상단 요소 pop 을 팝 업 하여 list 에 추가 합 니 다. 스 택 이 비어 있 거나 이때 까지 연산 자의 우선 순위 가 스 택 상단 요소 연산 자의 우선 순위 보다 클 때 까지 스 택 에 들 어 갑 니 다.
6. 표현 식 의 맨 오른쪽 까지 3 - 5 반복
7. stack 의 요 소 를 모두 팝 업 하여 list 에 추가 합 니 다.
8. 이때 list 결합 은 접미사 표현 식 (역 폴란드 식) 입 니 다.
코드
접미사 식 문자열 접미사 식 집합
/**
*
* @param express
* @return
*/
public static List toInfixExpressionList(String express){
List list = new ArrayList<>();
int length = express.length();
int i = 0;
char c ;
String str = "";
do{
if(( c = express.charAt(i)) < 48 || ( c = express.charAt(i)) > 57){
list.add(c+"");
i++;
}else{
//
str = "";//
// ASII ,48 0 57 9
while(i < length && (c = express.charAt(i)) >=48 && (c = express.charAt(i)) <= 57){
str+=c;
i++;
}
list.add(str);
}
}while(i < length);
return list;
}
연산 자의 우선 순위 가 져 오기
// ,
class Operation{
private static int ADD = 1;
private static int SUB = 1;
private static int MUL = 2;
private static int DIV = 2;
public static int getValue(String operation){
int result = 0;
switch (operation){
case "+":
result = ADD;
break;
case "-":
result = SUB;
break;
case "*":
result = MUL;
break;
case "/":
result = DIV;
default:
System.out.println(" ");
break;
}
return result;
}
}
접미사 식 접미사 식
/**
*
* @param infixExpressionList
* @return
*/
public static List parseSuffixExpressionList(List infixExpressionList){
Stack stack = new Stack<>();
List list = new ArrayList<>();
for (String item : infixExpressionList) {
// item ,
if(item.matches("\\d+")){
list.add(item);
}else if(item.equals("(")){
// item ( ,
stack.push(item);
}else if(item.equals(")")){
//
// item ) , stack , list , ( ,
while(!stack.peek().equals("(")){
list.add(stack.pop());
}
stack.pop();// (
}else{
//
while(stack.size() != 0 && Operation.getValue(item) <= Operation.getValue(stack.peek())){
list.add(stack.pop());
}
stack.push(item);
}
}
// stack list
while(stack.size() > 0){
list.add(stack.pop());
}
return list;
}
마지막 으로 한 문 제 를 풀 고 다른 곳 에서 참고 한 것 이다.https://blog.csdn.net/fascinatingGirl/article/details/52447647?utm_source=blogxgwz9
접미사 표현 식 X = A + B * (C - (D + F)) / E 접미사 표현 식 다음은 무엇 입 니까?
A.ABCDF+-*E/+
B.ABDF+C-*E/+
C.ABDF+C*-E/+
D.ABDF+C*-E+/
정 답: A
A+B*(C-(D+F))/E
1. A 를 읽 고 A 를 직접 출력 합 니 다.
2, 읽 기 +, 창고 에 넣 기
3. B 까지 읽 고 직접 출력 합 니 다. 이때 스 택 에 +, 출력 AB 가 있 습 니 다.
4. * 까지 읽 습 니 다. * 의 우선 순위 가 + 보다 높 기 때문에 스 택 에 들 어가 면 + * (오른쪽 은 스 택 꼭대기) 가 있 습 니 다.
5, 읽 기 (, 우선 순위 가 가장 높 고, 만 남) 에서 나 옵 니 다. 창고 에 들 어가 면 + * (
6. C 까지 읽 고 ABC 출력
7, 읽 기 -, 창고 에 들 어가 고, 창고 에 + * 가 있 습 니 다. ( —
8, 읽 기 (, 스 택 에 들 어가 고, 스 택 에 + 가 있 습 니 다. * ( —(
9, D 까지 읽 고 ABCD 출력
10. 읽 기 +, 스 택 에 들 어가 기, 스 택 에 + 가 있 습 니 다. * ( —( +
11. F 까지 읽 고 ABCDF 출력
12, 읽 기), 스 택 +, 출력 ABCDF +, 스 택 에 + * ( —
13. 읽 기), 스 택 나 가기 -. 출력 ABCDF + -, 스 택 에 + 가 있 습 니 다. *
14. 읽 기 /, 스 택 *, 스 택 에 들 어가 기 /, 출력 ABCDF + - *, 스 택 에 + /
15, 읽 기 E, 출력 ABCDF + - * E
15, 스 택 /, 출력 ABCDF + - * E /
16, 스 택 +, 출력 ABCDF + - * E / +
그래서 접미사 표현 식 은 ABCDF + - * E / + 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.