我正在编写一个程序,要求用户输入后缀表达式,然后将结果输出到表达式。我正试图使用一个单链表来实现这一点,并使用适配器模式来创建一个堆栈。
singlelinkedlist
类、LinkedStack
类和Stack
实现的代码都是直接从我自己的数据结构书中获得的。因此,SinglyLinkedListTest
类是唯一一个包含我自己的代码(并且有错误)的类。
我以前写过一个程序,它只使用堆栈计算后缀表达式,但这次我对包含的额外类感到困惑。
我肯定我有很多错误,但对我来说最明显的错误是在我的SinglyLinkedListTest
类中,每次我将一个值推到堆栈上。我知道问题在于,我试图将对象和字符推送到堆栈上,而不是将与push(ee)匹配的参数推送到堆栈上,但我不知道如何修改代码以使其工作。
如有任何建议或意见,将不胜感激。
这是我的堆栈实现:
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();
}
}
这是我的SingleLinkedList类:
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;
}
}
这是我的最后一个SinglelyLinkedListTest类:
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());
}
}
Stack<String> buffer = new LinkedStack<>();
>
buffer.push(someString.charAt(index));
和对象
:
buffer.push(answer);
并弹出int
:
num1 = buffer.pop();
你从来没有推或弹出字符串。
下定决心吧。您应该根据所需的精度推送和弹出整数
,或长
,或双倍
,或大小数
。
编辑
buffer.push((double)c);
这是无效的。推送的是ASCII值,而不是它对应的数值。你需要
buffer.push((double)Character.digit(c, 10));
在每个if
块之后,还需要一个else
:如果字符是一个数字,它就不会是,如果它是
它就不会是
-
,等等。
这是一个理论上的问题: 我必须计算一个表达式,我已经从中缀转换到后缀。后缀保存在中,因为我希望避免使用。这样我就知道数字之间的除法在哪里,我可以按“正确”的顺序访问它。 它看起来是这样的: 现在我想用两个堆栈: null 如果我到达一个运算符,并且数量计数至少为2,我将执行该操作并将其推到目标堆栈上。到达原始堆栈的末尾(现在是空的),我会把所有的东西都传递给它,然后从头开始,直到只剩下结果。 我现
本文向大家介绍中缀表达式转后缀表达式相关面试题,主要包含被问及中缀表达式转后缀表达式时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 对于中缀表达式,遇到操作数直接将其输出,如果遇到操作符和左括号全部压入栈中,若遇到右括号则将栈中元素全部弹出,直到遇到左括号为止。压栈过程中,若遇到其它操作符,从栈中弹出元素直到遇到更低优先级的操作符为止。
代码简介:我必须创建一个类来计算前缀、后缀或中缀表达式。它必须确定它是否是pre/post/infix,并将它们转换为后缀,例如,在从“/x7”转换为“x7/”的代码中,表达式在方法中从“x7/”编辑为“x7/”。这两种方法都很好,在多个示例上进行了测试(没有在这里发布完整的代码和作业,但也不需要它们。所问的问题只是我遇到的一个错误,不要担心,我不是在要求解决我的作业)。还有方法,因为可以有变量,
我试图在1次传递中评估一个内插表达式,而不将其转换为后缀,但它没有为某些表达式提供正确的输出。例如:3-5*10/5 10 , (45 5)-5*(100/10) 5 是否有人能在cpp中为这个问题提供适当的解决方案。 链接到上一个问题:如何使用堆栈在一次扫描中计算中缀表达式? 请不要将其标记为重复,因为我已经尝试了上述给定线程中回答的算法,但没有效果。
我得到了一段代码来破译、解释和提供任何改进建议。我被告知它可以工作,我们不能运行代码来测试它。我很理解它,但只需要有人来运行它,以确保我所理解的是正确的,请获得任何帮助来解释我不理解的地方。我已经做了大量的研究,仍然有一些问题。 代码正在实现用于读取只使用乘法和加法的后缀表达式。然后计算表达式,同时将结果保存到堆栈中。然后打印出结果。操作数被推到堆栈上,然后当它读取运算符时,它从堆栈中弹出前2个操
对于类,我们的任务是使用“抽象中的双链接列表堆栈实现”将中缀表达式转换为后缀。我能够编写一个使用堆栈进行转换的程序,但是双链表的用途是什么?我们将向列表中添加哪些信息节点? 这是作为示例提供给我们的堆栈类。为什么下一个变量是Stack类型?不应该是节点吗? 如果我创建双向链表和节点类,节点对象中有什么数据?