6

我在 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 for /, 3 for *。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

7

首先是a*b-b*c+c*d-d*eis not ab*bc*-cd*de*-+but的后置修复ab*bc*-cd*+de*-

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

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

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

于 2014-12-03T08:19:39.723 回答