我正在编写一个程序,要求用户提供后缀表达式,然后将结果输出到表达式。我试图使用单链接列表,并使用适配器模式创建堆栈。
SinglyLinkedList
类,LinkedStack
类和Stack
实现的代码都直接来自我拥有的数据结构书。所以SinglyLinkedListTest
类是唯一一个拥有自己代码的类(并且有错误)。
我之前编写的程序只是使用堆栈来评估后缀表达式,但这次我对这些额外的类感到困惑。
我确定我有很多错误,但对我来说最明显的错误是在我的SinglyLinkedListTest
类中,每次我将值推入堆栈时。我知道问题是我试图将对象和字符推送到堆栈而不是匹配push(E e)的参数,但我不知道如何更改我的代码以使其工作。
非常感谢任何建议或意见。
这是我的Stack Implementation:
package PostFix;
public interface Stack<E>
{
int size();
boolean isEmpty();
void push(E e);
E pop();
}
这是我的LinkedStack类:
package PostFix;
public class LinkedStack <E> implements Stack<E>
{
private SinglyLinkedList<E> list = new SinglyLinkedList<>();
public LinkedStack()
{
}
public int size()
{
return list.size();
}
public boolean isEmpty()
{
return list.isEmpty();
}
public void push(E e)
{
list.addFirst(e);
}
public E pop()
{
return list.removeFirst();
}
}
这是我的SinglyLinkedList类:
package PostFix;
public class SinglyLinkedList<E>
{
private static class Node<E>
{
private E element;
private Node<E> next;
public Node(E e, Node<E> n)
{
element = e;
next = n;
}
public E getElement()
{
return element;
}
public Node<E> getNext()
{
return next;
}
}
private Node<E> head = null;
private Node<E> tail = null;
private int size = 0;
public SinglyLinkedList()
{
}
public int size()
{
return size;
}
public boolean isEmpty()
{
return size == 0;
}
public void addFirst(E e)
{
head = new Node<>(e, head);
if (size == 0)
{
tail = head;
}
size++;
}
public E removeFirst()
{
if (isEmpty())
{
return null;
}
E answer = head.getElement();
head = head.getNext();
size--;
if (size == 0)
{
tail = null;
}
return answer;
}
}
这是 final SinglyLinkedListTest类:
package PostFix;
import java.util.Scanner;
public class SinglyLinkedListTest
{
public static void main(String[] args)
{
Double num1, num2, answer;
char c;
Stack<Double> stack = new LinkedStack<>();
Scanner input = new Scanner(System.in);
System.out.println("Enter the expression you would like to evaluate: ");
String someString = input.nextLine();
for (int index = 0; index < someString.length(); index++)
{
c = someString.charAt(index);
if (Character.isDigit(c))
{
stack.push((double)Character.digit(c, 10));
}
else if (c == '+')
{
num2 = stack.pop();
num1 = stack.pop();
answer = num1+num2;
stack.push(answer);
}
else if (c == '-')
{
num2 = stack.pop();
num1 = stack.pop();
answer = num1-num2;
stack.push(answer);
}
else if (c == '*')
{
num2 = stack.pop();
num1 = stack.pop();
answer = num1*num2;
stack.push(answer);
}
else if (c == '/')
{
num2 = stack.pop();
num1 = stack.pop();
answer = num1/num2;
stack.push(answer);
}
}
System.out.println("The result is: " + stack.pop());
}
}
答案 0 :(得分:1)
Stack<String> buffer = new LinkedStack<>();
stack
。您已将其声明为Stack<String>
,但您正在推动chars
:
buffer.push(someString.charAt(index));
和Objects
:
buffer.push(answer);
并弹出ints
:
num1 = buffer.pop();
你永远不会推或弹出字符串。
请下定决心。你应该推动并弹出ints
,longs
,doubles
或BigDecimals
,具体取决于你需要的精确度。
修改强>
buffer.push((double)c);
无效。您正在推送ASCII值,而不是它对应的数值。你需要
buffer.push((double)Character.digit(c, 10));
每个else
阻止后您还需要if
:如果该字符是数字,则不是+
,如果是+
不会是-
等等。