Как вызвать связанный список без реализации массива?

114
10

Для этого задания я пишу программу, которая будет вычислять результаты обратных польских выражений, которые предоставляются пользователем.

Я должен использовать связанный список для поддержки стека для этой программы (реализация массива стека не получит полного кредита).

Я должен обрабатывать следующие ситуации (ошибки): Слишком много операторов (+ -/*) Слишком много операндов (удваивается) Дистанция на ноль

Программа примет выражение в Польше, которое разделяет операторы и операнды на единое пространство и завершает выражение с помощью знака равенства. Программа будет продолжать принимать и оценивать выражения до тех пор, пока пользователь не вводит нуль (0) в строку сам по себе, а затем новую строку. мой образец вывода должен показывать обработку всех условий ошибки, а также использовать все операторы. Но когда я запускаю программу, она говорит об ошибке: главный метод не найден в классе program1.Program1, пожалуйста, определите основной метод как: public static void main (String [] args) Java Результат: 1 Я понятия не имею, как вызвать связанный список без реализации массива. Кроме того, класс RefObject и TryparseHelper находятся ниже в одном пакете. Тпх

 package program1;
import java.util.*;
import java.lang.IllegalStateException;

public class Program1 {

public class Node<T>
{
public T Data;
public Node<T> Next;
}

public class Stack<T>
{
private Node<T> top = null;

public final void Push(T value)
{
top = new Node<T>();
top.Data = value;
top.Next = top;
}

public final T Pop()
{
if (top == null)
{
throw new IllegalStateException("Cannot pop if the stack is empty.");
}

T topValue = top.Data;
top = top.Next;

return topValue;
}

public final boolean IsEmpty()
{
return top == null;
}

public final void Clear()
{
top = null;
}
}

public class ReversePolishCalculator
{

public final void Calculator()
{
String expression = "";
while (!expression.equals("0"))
{
System.out.print("Enter expression: ");
expression = new Scanner(System.in).nextLine();

try
{
System.out.println(" = " + Calculate(expression));
}
catch (RuntimeException ex)
{
System.err.println(ex.getMessage());
}
}
}

private Stack<Double> stack = new Stack<Double>();

private double Calculate(String expression)
{
double result = 0.0;
stack.Clear();

String[] tokens = expression.split("[ ]", -1);

for (String token : tokens)
{
double value = 0;
RefObject<Double> tempRef_value = new RefObject<Double>(value);
if (TryParseHelper.tryParseDouble(token, tempRef_value))
{
value = tempRef_value.argValue;
stack.Push(value);
}
else
{
value = tempRef_value.argValue;
DoOperation(token);
}
}

if (!stack.IsEmpty())
{
result = stack.Pop();
}

if (!stack.IsEmpty())
{
throw new IllegalStateException("Too many operands.");
}

return result;
}

private void DoOperation(String token)
{
if (stack.IsEmpty())
{
throw new IllegalStateException("Too many operators.");
}

double rhs = stack.Pop();

if (stack.IsEmpty())
{
throw new IllegalStateException("Too many operators.");
}

double lhs = stack.Pop();

switch (token)
{
case "+":
stack.Push(lhs + rhs);
break;
case "-":
stack.Push(lhs - rhs);
break;
case "*":
stack.Push(lhs * rhs);
break;
case "/":
if (rhs == 0.0)
{
throw new IllegalStateException("Divide by zero.");
}

stack.Push(lhs / rhs);
break;
default:
throw new IllegalStateException("Unexpected operator: " + token);
}
}
}

}

пакетная программа1; TryParseHelper

  /**
*
* @author David
*/
public final class TryParseHelper
{
public static boolean tryParseInt(String s, RefObject<Integer> result)
{
try
{
result.argValue = Integer.parseInt(s);
return true;
}
catch (NumberFormatException e)
{
return false;
}
}

public static boolean tryParseShort(String s, RefObject<Short> result)
{
try
{
result.argValue = Short.parseShort(s);
return true;
}
catch (NumberFormatException e)
{
return false;
}
}

public static boolean tryParseLong(String s, RefObject<Long> result)
{
try
{
result.argValue = Long.parseLong(s);
return true;
}
catch (NumberFormatException e)
{
return false;
}
}

public static boolean tryParseByte(String s, RefObject<Byte> result)
{
try
{
result.argValue = Byte.parseByte(s);
return true;
}
catch (NumberFormatException e)
{
return false;
}
}

public static boolean tryParseDouble(String s, RefObject<Double> result)
{
try
{
result.argValue = Double.parseDouble(s);
return true;
}
catch (NumberFormatException e)
{
return false;
}
}

public static boolean tryParseFloat(String s, RefObject<Float> result)
{
try
{
result.argValue = Float.parseFloat(s);
return true;
}
catch (NumberFormatException e)
{
return false;
}
}

public static boolean tryParseBoolean(String s, RefObject<Boolean> result)
{
try
{
result.argValue = Boolean.parseBoolean(s);
return true;
}
catch (NumberFormatException e)
{
return false;
}
}
}

пакетная программа1; RefObj

/** * * @author David */

 public final class RefObject<T>
{
public T argValue;
public RefObject(T refArg)
{
argValue = refArg;
}
}

спросил(а) 2017-09-17T08:33:00+03:00 2 года, 9 месяцев назад
1
Решение
96

В появившемся сообщении об ошибке говорится: для запуска вашей программы добавьте в класс Program1 метод с этой public static void main(String[] args). Напишите в нем код, который вы хотите запустить, например System.out.println("hi"); или что-то еще.

Обновление. Как я понял из вашего комментария, кажется, что ваша проблема пытается вызвать нестатический метод Calculator() из main(...). Во-первых, вам нужен фон для класса vs object и static vs non-static.

Класс - это шаблон или схема. Объект - это экземпляр этого проекта. Например, описание автомобиля является классом, любой автомобиль является объектом. Другим примером является ваш класс Stack и Stack<Double> stack = new Stack<Double>() вы использовали для вычисления выражения.

Когда вы вызываете pop() ему нужен определенный стек для запуска. Конкретный объект. Например, у вас одновременно может быть 2 стека, а вызов pop() на одном из них не должен влиять на другой. Поэтому метод pop() не статичен.

Теперь подумайте о классе Program1: действительно ли вы думаете о создании нескольких программ1 и их запуске/вызовете свои методы в своем коде? И будет ли у каждой программы1 другое состояние от другого? Каждый стек может иметь различное содержимое в любое время, но у программы 1 действительно нет контента или состояния.

Если у вас есть метод, который не зависит от какого-либо конкретного объекта или конкретного состояния, вы отмечаете его как статичный. Например, метод, который добавляет 2 числа, должен быть статическим. То же самое касается вашего метода Calculator().

Итак, вернемся к вашему вопросу, чтобы вызвать нестатический метод Calculator() из main(...), вам придется либо:

(1) конвертировать Calculator() в статический метод. Вы должны спросить себя: "Этот метод связан только с конкретным экземпляром, конкретным объектом?". Например, метод pop() Stack очень связан с определенным объектом стека. Если вы назовете это по 2 предметам стека, это даст разные результаты. Вот почему это должен быть нестатический метод, т.е. Метод, зависящий от конкретного экземпляра.
Однако Calculator() выглядит как метод, который на самом деле не зависит от чего-либо еще. Тот факт, что он использует переменную-член, называемую stack является случайным. Вы можете переместить переменную stack внутри Calculator(). Или вы можете просто сделать stack статическим.

(2) Вы могли бы, хотя это не имело бы большого смысла, создать экземпляр Program1 затем вызвать Calculator() на нем.

Я знаю, что разница между классом и объектом, а также статическая и нестатическая, может сбивать с толку в начале. Читайте больше об этом, со временем вы будете комфортно.

Для вопроса без массивов: если я правильно понимаю, у вас есть проблема с массивом в main(String[] args). Массив здесь является обязательным для запуска программы и не связан с реализацией стека. Поэтому я не ожидаю, что вы, учитель, не возражаете.

Наконец, обратите внимание, что код, я думаю, имеет некоторые проблемы, поэтому не ожидайте его запуска с первого раза. И это абсолютно нормально, и вам нужно знать, как отслеживать код. Удачи!

ответил(а) 2017-09-17T08:47:00+03:00 2 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема