中缀到后缀不能按预期工作

时间:2013-09-26 15:11:53

标签: java

我在Java中有这个功课,我必须将没有括号的中缀字符串转换为后缀字符串。我两天来一直在修补代码,但我无法捕捉到这个错误。这是我的代码。

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*-这是预期的输出,最后没有+

非常感谢任何建议。这个错误让我发疯了!

以下是整个代码:

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());
}
}

1 个答案:

答案 0 :(得分:7)

首先,a*b-b*c+c*d-d*e的帖子修复不是ab*bc*-cd*de*-+,而是ab*bc*-cd*+de*-

其次,错误在于你的val()功能。它应该是:

case '$' : return 0;
case '+' : return 1;
case '-' : return 1;
case '*' : return 2;
case '/' : return 2;
default : return -1;

更改并检查。它肯定会奏效。