Java linkedlist删除错误
我有一个家庭作业要做一个计算器,用堆栈把中缀转换成后缀。我的中缀到后缀的方法很好用。但另一种计算方法适用于所有情况,除非倍数或除数导致两位数。我的计算器不支持两位数的条目,但支持计算两位数。尝试输入: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成为前面的节点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语句
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);