6

私はJavaでこの宿題を持っています。ここでは、括弧なしの中置文字列を後置文字列に変換する必要があります。2 日間コードをいじりましたが、バグを見つけることができませんでした。これが私のコードです。

public class itp
{
    String exp, post;
    double res;
    int l;
    stack st;

    public itp(String s)
    {
        exp = s;
        post = "";
        l = exp.length();
        st = new stack(l);
        conv();
        calc();
        System.out.println("The postfix notation of "+exp+" is "+post);
        System.out.println("The result of "+exp+" is "+res);
    }

    public void conv()
    {
        char ch = ' ';
        char pre = ' ';
        for(int i =0;i<l;i++)
        {
            ch = exp.charAt(i);
            if("+-*/".indexOf(ch)==-1)post = post + ch;
            else
            {
                    pre = st.pop();
                    if(val(ch)>=val(pre))
                    {
                        st.push(pre);
                        st.push(ch);
                    }
                    else
                    {
                        while((val(ch)<=val(pre))&&(pre!='$'))
                        {
                            post = post + pre;
                            pre = st.pop();
                        }
                        st.push(ch);
                    }
            }
        }
        for(pre = st.pop();pre!='$';pre = st.pop())
        {
            post = post + pre;
        }
    }

    public void calc()
    {
        res = 0.0;
    }

    public int val(char c)
    {
        switch(c)
        {
            case '$' : return 0;
            case '+' : return 1;
            case '-' : return 2;
            case '*' : return 3;
            case '/' : return 4;
             default : return -1;
        }
    }
}

ここで、変数は次のとおりです。

  • stキャラクタースタックです
  • ch現在のキャラクターです
  • preスタックの一番上の文字です
  • exp入力中置式です
  • post出力後置式です

pop() メソッドは、スタックが空の場合を除いて期待どおりに機能し、そこで が返され$ます。関数 val() は char 入力を受け取り、 の場合は 4、 の/場合は 3 を返します*。のための 2 -。のための 1 +。整数lは の長さを保持しexpます。

a*b-b*c+c*d-d*eほとんどの場合、出力先のような文字列を指定する場合を除いて、うまく機能します。これは、最後ab*bc*-cd*de*-に a なしで期待される出力です。+

アドバイスをいただければ幸いです。このバグは私を夢中にさせます!

コード全体は次のとおりです。

public class itp
{
String exp, post;
double res;
int l;
stack st;

public itp(String s)
{
    exp = s;
    post = "";
    l = exp.length();
    st = new stack(l);
    conv();
    calc();
    System.out.println("The postfix notation of "+exp+" is "+post);
    System.out.println("The result of "+exp+" is "+res);
}

public void conv()
{
    char ch = ' ';
    char pre = ' ';
    for(int i =0;i<l;i++)
    {
        ch = exp.charAt(i);
        if("+-*/".indexOf(ch)==-1)post = post + ch;
        else
        {
                pre = st.pop();
                if(val(ch)>=val(pre))
                {
                    st.push(pre);
                    st.push(ch);
                }
                else
                {
                    while((val(ch)<=val(pre))&&(pre!='$'))
                    {
                        post = post + pre;
                        pre = st.pop();
                    }
                    st.push(ch);
                }
        }
    }
    for(pre = st.pop();pre!='$';pre = st.pop())
    {
        post = post + pre;
    }
}

public void calc()
{
    res = 0.0;
}

public int val(char c)
{
    switch(c)
    {
        case '$' : return 0;
        case '+' : return 1;
        case '-' : return 2;
        case '*' : return 3;
        case '/' : return 4;
         default : return -1;
    }
}
}

スタッククラスは次のとおりです。

public class stack
{
char[] a;
int top,size;

public stack(int s)
{
    size = s;
    a = new char[size];
    top = -1;
}

public void push(char el)
{
    a[++top] = el;
}

public char pop()
{
    if(empty()) return '$';
    else return a[top--];
}

public boolean empty()
{
    return (top == -1);
}
}

メインクラスはこちら

import java.util.Scanner;
class client
{
public static void main(String args[])
{
    System.out.println("Enter the expression");
    Scanner in = new Scanner(System.in);
    itp i = new itp(in.next());
}
}
4

1 に答える 1