고급 얼굴 질문 (후위 표기법에 중위 표현)

* B + C- (D +의 식 1의 a를 E) / F 에 대한 접미사 발현?
심볼 적층 스택에 파라미터 기호 오른쪽으로 스캔 파라미터 좌측으로부터 순차적으로 스캐닝

스윕의 수 값으로 스캔 매개 변수 스택 기호 스택 설명
처음 첫 번째 스캔 스택에 직접 매개 변수 인
+ + 두 번째는 스캔 플러스 스택에 직접 서명하는 것입니다
세 번째 + 세 번째 스캔 파라미터들에 순차적으로 적층 ㄴ
네번째 * * + 나는 다음 매개 변수 제목의 만남을 모르기 때문에 넷째는 * 기호 스택에 우리가 처음 움직이지 않는 무엇인가를 스캔
다섯 번째 * + CBA 다섯 번째는,는 C 매개 변수 스택에 스캔하기 때문에 곱셈 고조 수준 매개 변수 스택, 스택을 입력하고, 스택의 첫 번째 좋은 소식을 가지고하는 데 필요한 것보다 플러스
여섯 번째 - * + CBA - 여섯 번째로 스캔 - 직접 스택 기호로
일곱 번째 ( * + CBA (- 일곱 직접 스택에 심볼 (로 스캔
여덟 번째 D + * CBA (- 여덟째 스택 D 인 파라미터에 직접 주사
아홉 번째 + D + * CBA + (- 아홉 번째는 + 기호 스택에 스캔
열 번째 이자형 ED + * CBA + (- 파라미터 스택에 직접 주사 전자 열째이고
십일 ) ED + + * CBA - 열한번째 스캔) 좌우 괄호 적층 매개로 브래킷 심볼들을 페어링
열두 번째 / ED + + * CBA / - 두번째 스캔은 / 운영자 스택으로 나눈다
십삼 에프 - / F + + * ED CBA 스택에 열세 번째 스캔 / 하이 레벨 파라미터

팝 뒤로 돌려

ABC * + 드 + F / -

기차에 30 분 동안 아웃

객체의 스택의 정의

package main.com.cs.suffix;

public class MyCharStack {

    //定义栈
    private char[] array;

    //定义栈的最大范围
    private int maxSize;

    //栈顶
    private int top;

    public MyCharStack(int size){
        this.maxSize = size;
        array = new char[size];
        top = -1;
    }

    //压入数据
    public void push(char value){
        if(top < maxSize-1){
            array[++top] = value;
        }
//        throw new RuntimeException("栈大小超出范围");
    }

    //弹出栈顶数据
    public char pop(){
        return array[top--];
    }

    //访问栈顶数据
    public char peek(){
        return array[top];
    }

    //查看指定位置的元素
    public char peekN(int n){
        return array[n];
    }

    //为了便于后面分解展示栈中的内容,我们增加了一个遍历栈的方法(实际上栈只能访问栈顶元素的)
    public void displayStack(){
        System.out.print("Stack(bottom-->top):");
        for(int i = 0 ; i < top+1; i++){
            System.out.print(peekN(i));
            System.out.print(' ');
        }
        System.out.println("");
    }

    //判断栈是否为空
    public boolean isEmpty(){
        return (top == -1);
    }

    //判断栈是否满了
    public boolean isFull(){
        return (top == maxSize-1);
    }
}

활용 전송 방법 접미사 정의

package main.com.cs.suffix;

public class InfixToSuffix {
    private MyCharStack s1;//定义运算符栈
    private MyCharStack s2;//定义存储结果栈
    private String input;
     
    //默认构造方法,参数为输入的中缀表达式
    public InfixToSuffix(String in){
        input = in;
        s1 = new MyCharStack(input.length());
        s2 = new MyCharStack(input.length());
    }
    //中缀表达式转换为后缀表达式,将结果存储在栈中返回,逆序显示即后缀表达式
    public MyCharStack doTrans(){
        for(int j = 0 ; j < input.length() ; j++){
            System.out.print("s1(符号)栈元素为:");
            s1.displayStack();
            System.out.print("s2(参数)栈元素为:");
            s2.displayStack();
            char ch = input.charAt(j);
            System.out.println("当前解析的字符:"+ch);
            switch (ch) {
            case '+':
            case '-':
                gotOper(ch,1);
                break;
            case '*':
            case '/':
                gotOper(ch,2);
                break;
            case '(':
                s1.push(ch);//如果当前字符是'(',则将其入栈
                break;
            case ')':
                gotParen(ch);
                break;
            default:
                //1、如果当前解析的字符是操作数,则直接压入s2
                //2、
                s2.push(ch);
                break;
            }//end switch
        }//end for
         
        while(!s1.isEmpty()){
            s2.push(s1.pop());
        }
        return s2;
    }
     
    public void gotOper(char opThis,int prec1){
        while(!s1.isEmpty()){
            char opTop = s1.pop();
            if(opTop == '('){//如果栈顶是'(',直接将操作符压入s1
                s1.push(opTop);
                break;
            }else{
                int prec2;
                if(opTop == '+' || opTop == '-'){
                    prec2 = 1;
                }else{
                    prec2 = 2;
                }
                if(prec2 < prec1){//如果当前运算符比s1栈顶运算符优先级高,则将运算符压入s1
                    s1.push(opTop);
                    break;
                }else{//如果当前运算符与栈顶运算符相同或者小于优先级别,那么将S1栈顶的运算符弹出并压入到S2中
                    //并且要再次再次转到while循环中与 s1 中新的栈顶运算符相比较;
                    s2.push(opTop);
                }
            }
             
        }//end while
        //如果s1为空,则直接将当前解析的运算符压入s1
        s1.push(opThis);
    }
     
    //当前字符是 ')' 时,如果栈顶是'(',则将这一对括号丢弃,否则依次弹出s1栈顶的字符,压入s2,直到遇到'('
    public void gotParen(char ch){
        while(!s1.isEmpty()){
            char chx = s1.pop();
            if(chx == '('){
                break;
            }else{
                s2.push(chx);
            }
        }
    }
 
}

정의 된 시험 방법

package test.com.cs;

import main.com.cs.suffix.InfixToSuffix;
import main.com.cs.suffix.MyCharStack;
import org.junit.Test;

import java.util.Scanner;

public class suffix {

    public static void main(String[] args) {

        String input;
        System.out.println("Enter infix:");
        Scanner scanner = new Scanner(System.in);
        input = scanner.next();
        InfixToSuffix in = new InfixToSuffix(input);
        MyCharStack my = in.doTrans();
        my.displayStack();

    }
}

테스트 결과

그림 삽입 설명 여기그림 삽입 설명 여기

게시 69 개 원래 기사 · 원 찬양 6 · 전망 2506

추천

출처blog.csdn.net/qq_40539437/article/details/103951016