* 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();
}
}
테스트 결과