1

Prefix 式を Postfix 式に変換するコードを書こうとしています。

これまでのところ、これが私が作ったものです(私は新しいので、効率的ではないかもしれないことに注意してください!)

/***************************************************
 NOTE: This code fails to realise the precedence
    of parentheses and $ (exponential) expressions
****************************************************/

import java.util.Scanner;

class Stack{
    //Private Declarations
    private int top;
    private String a[] = new String [100];
    //Public Declarations
    public Stack(){
        top = -1;
        a[0] = "\0";
    }
    public void push(String x){
        if (top != 99){
            a[++top] = x;
        }
        else{
            System.out.println("Stack overflow");
        }
    };
    public String pop(){
        if (top == -1){
            System.out.println("\nStack empty!");
            return "\n";
        }
        else{
            return a[top--];
        }
    };
    public int ret_top(){
        return top;
    };
}


public class Prefix2Postfix {
    public static void main(String[] args) {
        //Declaration
        Scanner in = new Scanner (System.in);
        Stack op = new Stack ();
        Stack sym = new Stack ();
        char ch;
        int i;
        String exp, str, str1, str2, str3;

        //Taking input from the user
        System.out.println("Enter the prefix expression : ");
        exp = in.next();

        for (i=0; i<exp.length(); i++){
            ch = exp.charAt(i);
            if((ch == '+')
             ||(ch == '-')
             ||(ch == '*')
             ||(ch == '/')
             ||(ch == '$')){
                str = Character.toString(ch);
                op.push(str);
            }
            else{
                str = Character.toString(ch);
                sym.push(str);
            if (sym.ret_top() == 1){
                str1 = sym.pop();
                str2 = sym.pop();
                str3 = op.pop();
                str1 = str2.concat(str1);
                str1 = str1.concat(str3);
                sym.push(str1);
            }
            }
        }

        //Output
        str = sym.pop();
        System.out.println("After conversion to postfix" + ": " + str);
        in.close();
    }
}

コードで既にコメントしたように、私のコードは接頭辞式の場合の優先順位を認識できません。

例えば:

Infix   : a + (b*c)
Prefix  : +a*bc 
Postfix : abc*+ //Expected output 
Output I get : ab*c+

使用しているロジックに何か問題がありますか、または追加する必要があるものはありますか? 私のコードが正しく動作する方法を教えてください。誰かが助けてくれれば、私は感謝します。

注: 私たちの教授は、独自のスタック クラスとコードを作成するようにアドバイスしてくれました。また、これは一種の宿題であることにも注意してください。

前もって感謝します。


編集: スタックが正常に動作することを確認するために、次のコードを書きましたが、完全に正常に動作します。

import java.util.Scanner;

class STACK {
    //Private Declarations
    private int top;
    private int elem[] = new int [100];
    //Public Declarations
    public STACK (){
        top = -1;
        elem[0] = 0;
    }
    public void push(int x){
        if (top != 99){
            elem[++top] = x;
        }
        else{
            System.out.println("Stack overflow");
        }
    };
    public int pop(){
        if (top == -1){
            System.out.println("Stack empty!");
            return 0;
        }
        else{
            return elem[top--];
        }
    };
}

public class StackPushPop {
    public static void main(String[] args) {
        STACK s = new STACK();
        Scanner in = new Scanner (System.in);
        int choice, x;
        do{
            System.out.println("Menu Options :");
            System.out.println("1 -> Push an element");
            System.out.println("2 -> Pop an element");
            System.out.println("3 -> Empty complete stack");
            System.out.println("Any other input for exit");
            System.out.println("Your choice : ");
            choice = in.nextInt();
            switch(choice){
                case 1: 
                    System.out.println("\nEnter element : ");
                    x = in.nextInt();
                    s.push(x);
                    break;
                case 2:
                    System.out.print("\nPopping element : ");
                    x = s.pop();
                    if (x != 0){
                        System.out.println(x);
                    }
                    break;
                case 3:
                    System.out.println("\nEmptying stack!");
                    x = 1;
                    while (x!= 0){
                        x = s.pop();
                        if(x != 0){
                            System.out.print(x + "  ");
                        }
                    }
                    break;
                default:
                    choice = 0;
            }

        }while (choice != 0);
    }
}

EDIT 私は最終的に完全に正常に動作するプログラムを作成することができました.

import java.util.Scanner;

class STACK{
    private int top, MAX;
    private String a[] = new String [1000];
    public STACK(){
        top = -1;
        MAX = 1000;
        a[0] = "";
    }
    public void push(String x){
        if (top <= MAX-1){
            a[++top] = x;
        }
        else{
            System.out.println("Stack overflow");
        }
    };
    public String pop(){
        if (top == -1){
            System.out.println("\nStack empty!");
            return "\n";
        }
        else{
            return a[top--];
        }
    };
    public int getTop(){
        return top;
    };
}

public class Prefix2Postfix_STACK{
    static boolean isOperator (char ch){
        switch (ch){
            case '+':
            case '-':
            case '*':
            case '/':
            case '$':
                        return true;
            default :
                        return false;
        }
    }
    public static void main(String[] args) {
        //declarations
        Scanner in = new Scanner (System.in);
        String exp;
        int i;
        STACK s = new STACK ();
        String exp_str[] = new String[100];
        String postfix_exp = "\n";

        //input
        System.out.println("Enter prefix expression (No spaces or brackets) : ");
        exp = in.next();

        //create a string array of all characters but in reverse
        for(i=0; i<=exp.length()-1; i++){
            exp_str[exp.length()-1-i]=Character.toString(exp.charAt(i));
        }

        //computing postfix:
        i=0;
        do{ 
            if (!isOperator(exp_str[i].charAt(0)))
                s.push(exp_str[i]);
            else{
                String str1 = s.pop();
                String str2 = s.pop();
                str1 = str1 + str2 + exp_str[i];
                postfix_exp = str1;
                s.push(str1);
            }
            i++;
        }while(s.getTop()>=0 && i!=exp.length());

        //Output
        System.out.println("After converting to postfix : " + postfix_exp);
        in.close();
    }
}
4

1 に答える 1