使用单链接列表评估后缀表达式

时间:2016-02-18 01:10:10

标签: java linked-list stack postfix-notation

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

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

1 个答案:

答案 0 :(得分:1)

Stack<String> buffer = new LinkedStack<>();
  • 名称不好:称之为stack
  • 您已将其声明为Stack<String>,但您正在推动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));

每个else阻止后您还需要if:如果该字符是数字,则不是+,如果是+不会是-等等。