【问题标题】:Evaluate a Postfix Expression Using a Singly Linked List使用单链表计算后缀表达式
【发布时间】:2016-02-18 01:10:10
【问题描述】:

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

SinglyLinkedList 类、LinkedStack 类和 Stack 实现的代码都直接来自我拥有的一本数据结构书。所以SinglyLinkedListTest 类是唯一一个包含我自己的代码(并且有错误)的类。

我之前写过一个简单地使用堆栈来评估后缀表达式的程序,但这次我对包含的额外类感到困惑。

我确定我有很多错误,但对我来说最明显的错误是在我的 SinglyLinkedListTest 类中,每次我将一个值压入堆栈时。我知道问题是我试图将对象和字符推送到堆栈上,而不是与 push(E e) 匹配的参数,但我不知道如何更改我的代码以使其工作。

任何建议或意见将不胜感激。

这是我的堆栈实现:

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

【问题讨论】:

  • 有什么问题?
  • @EJP - 在我的 SinglyLinkedListTest 类中,我试图将元素推送到堆栈上,但我试图推送的参数与 push(E e) 方法中定义的参数不同(我我试图将对象和字符推入堆栈而不是 E e)。如何使参数匹配,或者如何更改代码以成功将这些元素推送到堆栈上?
  • 定义'不是相同的参数','使参数匹配',...

标签: java linked-list stack postfix-notation


【解决方案1】:
Stack<String> buffer = new LinkedStack<>();
  • 可怜的名字:叫它stack
  • 您已将其声明为Stack&lt;String&gt;,但您正在推送chars

     buffer.push(someString.charAt(index));
    

    Objects:

    buffer.push(answer);
    

    然后弹出ints:

    num1 = buffer.pop();
    
  • 您永远不会推动或弹出字符串。

只要下定决心。您应该推送和弹出intslongsdoublesBigDecimals,具体取决于您需要的精度。

编辑

buffer.push((double)c);

无效。您推送的是 ASCII 值,而不是它对应的数值。你需要

buffer.push((double)Character.digit(c, 10));

您还需要在每个if 块之后添加else:如果字符是数字,则不是+,如果是+,则不是-等。

【讨论】:

  • 我把编辑后的代码贴在上面。这消除了我所有的错误,我的程序现在运行。但是,我得到了错误的答案。减法每次都有效,但所有其他操作数每次都不正确。以下是我得到的一些答案:63+ = 105, 63* = 2754, 63/ = 1.0588, 54+=105, 54* = 2756, 54/ = 1.0192
  • 非常感谢。我发布了最终代码。效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 2017-05-02
  • 1970-01-01
相关资源
最近更新 更多