1

当我计算 (1 3 +) 时,我得到了正确的答案。但是当我计算像 (A 1 +) 这样的语句时,我得到了错误的答案。

在这个问题中,我尝试评估像 (5 7 + 7 * 8 + ~) 这样的十六进制语句。

这是代码。

import java.io.*;
import java.util.Stack;


/**
 *
 * @author Dilini
 */
public class Acadox {

    /**
     * @param args the command line arguments
     */


    public static boolean isOperator(String c)
    {
        return ( "+".equals(c) || "-".equals(c) || "&".equals(c) || "|".equals(c) || "~".equals(c) || "X".equals(c));
    }



   /* public String convert(String str)
    {
          char[] chars = str.toCharArray();
          StringBuffer strBuffer = new StringBuffer();
          for (int i = 0; i < chars.length; i++)
          {
            strBuffer.append(Integer.toHexString((int) chars[i]));
          }
          return strBuffer.toString();
    }*/

    public static void main(String[] args)throws IOException {
        // TODO code application logic here

        try
        {
            BufferedReader read = new BufferedReader(new InputStreamReader(System.in));

            String s[]=read.readLine().split(" ");

            Stack<String> st=new Stack<String>();

            st.push(s[0]);
            int i=1;

            int num1,num2,result=0;

            if(isOperator(s[1]) && !"~".equals(s[1]))
            {
                System.out.println("ERROR");
            }
            else if(!isOperator(s[s.length-1]))
            {
                System.out.println("ERROR");
            }
            else
            {
                do
                {
                    if(!isOperator(s[i]))
                    {
                        st.push(s[i]);
                        i++;
                    }  
                    else
                    {


                        if("+".equals(s[i]))
                        {
                            num1 = Integer.parseInt(st.pop(), 16);
                            num2 = Integer.parseInt(st.pop(), 16);

                            result=num1+num2;
                            st.push(""+result);
                        }
                        else if("-".equals(s[i]))
                        {
                            num1 = Integer.parseInt(st.pop(), 16);
                            num2 = Integer.parseInt(st.pop(), 16);

                            result=num1-num2;
                            st.push(""+result);
                        }
                        else if("&".equals(s[i]))
                        {
                            num1 = Integer.parseInt(st.pop(), 16);
                            num2 = Integer.parseInt(st.pop(), 16);

                            result=num1&num2;
                            st.push(""+result);
                        }
                        else if("|".equals(s[i]))
                        {
                            num1 = Integer.parseInt(st.pop(), 16);
                            num2 = Integer.parseInt(st.pop(), 16);

                            result=num1|num2;
                            st.push(""+result);
                        }
                        else if("~".equals(s[i]))
                        {
                            num1 = Integer.parseInt(st.pop(), 16);

                            result=~num1;
                            st.push(""+result);
                        }
                        else if("X".equals(s[i]))
                        {
                            num1 = Integer.parseInt(st.pop(), 16);
                            num2 = Integer.parseInt(st.pop(), 16);

                            result=num1^num2;
                            st.push(""+result);
                        }

                        i++;

                    }



                }
                while(st.size()!=1);

                result=Integer.parseInt(st.pop(),16);
                System.out.println(result);
            }




        }
        catch(IOException e)
       {
           System.out.println(e.getMessage());
       }
    }
}

请给我一个解决方案。

谢谢你。

4

1 回答 1

0

问题出在你这样做的时候

st.push(""+result);

此代码实质上是将整数转换为以 10 为底的数字,然后将其转换为字符串。由于您的循环机制,当这个结果被 Integer.parseString(st.pop(), 16) 重新解析时,它被错误地读取(当它是一个 base-10 整数时,它是一个 base-16 整数)。

用此替换所有 st.push() 引用,然后重试:

st.push(Integer.toString(result, 16));
于 2013-10-26T05:21:47.600 回答