StringIndexOutOfBoundsException в стеке PrefixtoPostFix (Java) - PullRequest
0 голосов
/ 21 сентября 2019

В этом проекте есть два класса.Метод Main - это Test2, а дочерний класс - это Stack.Часть ошибки здесь является этой частью:

Stack s = new Stack (20);

И всякий раз, когда я запускаю его, он выдает следующее:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4
    at java.lang.String.charAt(Unknown Source)
    at com.stack.Test2.prefixToPostfix(Test2.java:31)
    at com.stack.Test2.main(Test2.java:18)

Как мне поставить "n items", если генерики Stack продолжают отвечать на сообщения об ошибках?

MainМетод ниже:

 package com.stack;
        import java.util.Stack;
        //PREFIX TO POSTFIX
        public class Test2 {
            public static void main(String[] args) {
                String prefix1 = "A + B * C";
                System.out.println(prefixToPostfix(prefix1));
            }

    static String prefixToPostfix(String prefix) {
        Stack<String> s = new Stack(100); 
        String[] tokens = prefix.split(" ");
        for (int i = tokens.length-1; i>=0; i--) {
            String token = tokens[i];
            if (Character.isLetterOrDigit(token.charAt(i))) { 
                String op1 = s.peek(); s.pop();
                String op2 = s.peek(); s.pop();
                String exp = op1 + op2 + token;
                s.push(exp); 
            } 
            else {
                s.push(token + " "); 
            } 
        } 
        return s.peek(); 
    } 
}

ЭТО ОДИН ИЗ СТЕКОВЫХ ОПЕРАЦИЙ ДЛЯ ISEMPTY, ISFULL, PEEK, PUSH, ETC.

package com.stack;
public class Stack<T> {  
    int size;
    T A[];
    int top = -1;

    public Stack(int size) {
        this.size = size;
        A = (T[]) new Object[size];
        top = -1;
    }
    public void push(T item) {
        top++;
        A[top] = item;
    }

    public void pop() {
        top--;
    }

    public boolean isEmpty() { 
        if(top == - 1) {
            return true;
        }
        return false;
    }
    public T peek() {
        return A[top];
    }
}

1 Ответ

0 голосов
/ 21 сентября 2019

Замените это

 if (Character.isLetterOrDigit(token.charAt(i))) 

на это

  if (Character.isLetterOrDigit(token.charAt(0)))

вы получаете эту ошибку, потому что длина каждой переменной в вашем массиве токенов равна 1, и вы пытаетесь получить символ на 4-мположение.

...