当前位置: 首页 > 知识库问答 >
问题:

使用单链表计算后缀表达式

艾才良
2023-03-14

我正在编写一个程序,要求用户输入后缀表达式,然后将结果输出到表达式。我正试图使用一个单链表来实现这一点,并使用适配器模式来创建一个堆栈。

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());
    }
}

共有1个答案

长孙作人
2023-03-14
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类型?不应该是节点吗? 如果我创建双向链表和节点类,节点对象中有什么数据?