Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java linkedlist删除错误_Java_Linked List - Fatal编程技术网

Java linkedlist删除错误

Java linkedlist删除错误,java,linked-list,Java,Linked List,我有一个家庭作业要做一个计算器,用堆栈把中缀转换成后缀。我的中缀到后缀的方法很好用。但另一种计算方法适用于所有情况,除非倍数或除数导致两位数。我的计算器不支持两位数的条目,但支持计算两位数。尝试输入:2+2*5/2、2+5*4/2,以及其他类似格式的输入。 第二次运行计算除法时,第151行出现错误。 这是linkedlist中发生的情况: [2, 2, 5, *, 2, /, +] [2, 10, 2, /, +] [10,2,+]--错误 它应该删除/、2和10,从而删除3 removes语句

我有一个家庭作业要做一个计算器,用堆栈把中缀转换成后缀。我的中缀到后缀的方法很好用。但另一种计算方法适用于所有情况,除非倍数或除数导致两位数。我的计算器不支持两位数的条目,但支持计算两位数。尝试输入:2+2*5/2、2+5*4/2,以及其他类似格式的输入。 第二次运行计算除法时,第151行出现错误。 这是linkedlist中发生的情况: [2, 2, 5, *, 2, /, +] [2, 10, 2, /, +] [10,2,+]--错误 它应该删除/、2和10,从而删除3 removes语句。但是当它执行eval.remove(eval.get(i-1))时,前面的2消失,10成为前面的节点

    import java.util.Stack;
import java.util.LinkedList;

public class Calculator
{
    Stack<Character> infix = new Stack<Character>();

    StringBuilder postfix = new StringBuilder();
    Stack<String> postfix_str = new Stack<String>();

    String operators = "+-*/^";

    String infix2postfix(String infix_str)
    {
        int i = 0;
        boolean flag = true;

        while (!infix_str.isEmpty())
        {
            if (infix_str.charAt(i) == '(')
            {
                infix.push(infix_str.charAt(i));
                infix_str = infix_str.substring(i+1, infix_str.length());
            }
            else
            {
                if (Character.getNumericValue(infix_str.charAt(i)) >= 0 && 
                    Character.getNumericValue(infix_str.charAt(i)) <= 9)
                {
                    postfix.append(infix_str.charAt(i));
                    postfix_str.push(String.valueOf(infix_str.charAt(i)));//added
                    infix_str = infix_str.substring(i+1, infix_str.length());
                }
                else //operator
                {
                    if (!(infix_str.charAt(i) == ')'))
                    {
                        if (infix.empty() || infix.peek() == '(' || !(preced(infix_str.charAt(i), infix.peek())))
                        {
                            infix.push(infix_str.charAt(i));
                            infix_str = infix_str.substring(i+1, infix_str.length());
                        }
                        else
                        {
                            postfix_str.push(String.valueOf(infix.peek()));//added
                            postfix.append(infix.pop());
                        }
                    }
                    else
                    {
                        try
                        {
                            while (infix.peek() != '(')
                            {
                                postfix_str.push(String.valueOf(infix.peek()));//added
                                postfix.append(infix.pop());
                            }
                            infix.pop();
                            infix_str = infix_str.substring(i+1, infix_str.length());
                         }
                         catch(Exception EmptyStackException)
                         {
                            System.out.println("Unbalanced Parathesis");
                            break;
                         }
                    }
                }
            }
        }
        while (!infix.empty())
        {
            postfix_str.push(String.valueOf(infix.peek()));//added
            postfix.append(infix.pop());
        }
        System.out.println(postfix);
        System.out.println(postfix_str.toString());
        return postfix.toString();
    }

    /**
     * 
     * @param statement operator, top of stack
     * @return true to pop
     */
    boolean preced(char arg1, char arg2)//when to pop (true - pop)
    { 
        String firstPreced = "^";
        String secondPreced = "*/";
        String thirdPreced = "+-";

        //EQUALS TO
        if ((thirdPreced.charAt(0) == arg1 || thirdPreced.charAt(1) == arg1)
                                          &&
            (thirdPreced.charAt(0) == arg2 || thirdPreced.charAt(1) == arg2))
        {return true;}
        if ((secondPreced.charAt(0) == arg1 || secondPreced.charAt(1) == arg1)
                                          &&
            (secondPreced.charAt(0) == arg2 || secondPreced.charAt(1) == arg2))
        {return true;}
        if (firstPreced.charAt(0) == arg1
                        &&
            firstPreced.charAt(0) == arg2) 
        {return true;}


        if ((thirdPreced.charAt(0) == arg1 || thirdPreced.charAt(1) == arg1)
                                          &&
            (secondPreced.charAt(0) == arg2 || secondPreced.charAt(1) == arg2))
        {return true;}

        if ((thirdPreced.charAt(0) == arg1 || thirdPreced.charAt(1) == arg1)
                                          &&
            (firstPreced.charAt(0) == arg2))
        {return true;}

        return false;
    }

    void evalPostfix(String postfix)//2+2*5/2
    {
        LinkedList<String> eval = new LinkedList<String>();
        //[2, 2, 5, *, 2, /, +]
        //[2, 10, 2, /, +]
        //[2, 5, +] -- should be
        //[10, 2, +] -- result
        while (!postfix_str.empty())
        {
            eval.addFirst(postfix_str.pop());
        }

        int i = 0;

        while (!(eval.size() == 1))
        {                      
            if (eval.get(i).equals("+") || eval.get(i).equals("-") || eval.get(i).equals("*") || eval.get(i).equals("/")
                    || eval.get(i).equals("^"))
            {
                double total = 0;
                if (eval.get(i).equals("+"))
                {total = Double.valueOf(eval.get(i - 1)) + Double.valueOf(eval.get(i - 2));}
                if (eval.get(i).equals("-"))
                {total = Double.valueOf(eval.get(i - 1)) - Double.valueOf(eval.get(i - 2));}
                if (eval.get(i).equals("*"))
                {total = Double.valueOf(eval.get(i - 1)) * Double.valueOf(eval.get(i - 2));}
                if (eval.get(i).equals("/"))
                {total = Double.valueOf(eval.get(i - 2)) / Double.valueOf(eval.get(i - 1));}
                if (eval.get(i).equals("^"))
                {total = Double.valueOf(eval.get(i - 1)) ^ Double.valueOf(eval.get(i - 2));}

                eval.remove(eval.get(i));
                eval.remove(eval.get(i-1));//BUG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                eval.remove(eval.get(i-2));

                i-=2;

                String sum_str = Double.toString(total);

                eval.add(i, sum_str);

                total = 0;
            }
            else
            {
                i++;
            }
        }
        System.out.println(eval.get(0));
    }
}



   import java.util.Scanner;

public class CalculatorTest
{
    public static void main(String[] args)
    {
        while(true)
        {
        Calculator calc = new Calculator();
        Scanner in = new Scanner(System.in);
        System.out.println("Enter Calc");
        String input = in.nextLine();
        calc.infix2postfix(input);
        calc.evalPostfix("");
        }
    }
}
import java.util.Stack;
导入java.util.LinkedList;
公共类计算器
{
堆栈中缀=新堆栈();
StringBuilder后缀=新的StringBuilder();
堆栈后缀_str=新堆栈();
字符串运算符=“+-*/^”;
字符串中缀后缀(字符串中缀)
{
int i=0;
布尔标志=真;
而(!infix_str.isEmpty())
{
如果(中缀字符(i)='(')
{
中缀推(中缀字符(i));
中缀字符串=中缀字符串子字符串(i+1,中缀字符串长度());
}
其他的
{
如果(Character.getNumericValue(中缀字符(i))>=0&&

Character.getNumericValue(infix_str.charAt(i))看起来您正在使用该方法从链接列表中删除项目。此方法通过引用删除项目,因此它会搜索要删除的项目。由于项目可以在链接列表中出现多次,因此听起来像是在查找项目的第一个实例(
“2”
)并删去该条。[*]

也许您可以尝试使用按位置删除项目的。因此:

[*]我在这里强调了一些细节,比如两个字符串的两个引用实际上可以是同一个项目。这可能是由于字符串实习,但如果没有对代码进行更详细的检查,我无法确定

eval.remove(i);
eval.remove(i-1);
eval.remove(i-2);