Оценка Postfix с помощью объекта [duplicate]

Прежде всего, если вы находитесь в & lt; 5.3PHP, то нет. У тебя много проблем, чтобы справиться.

Я удивлен, что никто не упомянул библиотеку intl , которая имеет хорошую поддержку для unicode, графем, строковых операций, локализации и многих других, см. ниже.

Я приведу некоторую информацию о поддержке Unicode в PHP с помощью слайдов Elizabeth Smith в PHPBenelux'14

INTL

Хорошо:

  • Обертка вокруг библиотеки ICU
  • Стандартизованные локали, установка языка для каждого скрипта
  • Форматирование чисел
  • Форматирование валюты
  • Форматирование сообщений (заменяет gettext)
  • Календари, даты, часовой пояс и время
  • Транслитератор
  • Spoofchecker
  • Пакеты ресурсов
  • Конвертеры
  • Поддержка IDN
  • Graphemes
  • Collation
  • Итераторы

Плохо :

  • Не поддерживает zend_multibite
  • Не поддерживает преобразование входного сигнала HTTP
  • Не поддерживает перегрузку функции

mb_string

  • Включает поддержку zend_multibyte
  • Поддерживает прозрачную кодировку HTTP in / out
  • Предоставляет некоторые обертки для funtionallity, такие как strtoupper

ICONV

  • Первичный для преобразования кодировки
  • Обработчик выходных буферов
  • Функциональность кодирования mime
  • conversion
  • некоторые строковые помощники (len, substr, strpos, strppos)
  • Фильтр потока stream_filter_append($fp, 'convert.iconv.ISO-2022-JP/EUC-JP')

БАЗЫ ДАННЫХ

  • mysql: кодировка и сопоставление таблиц и соединений (не сортировка). Также не используйте mysql-msqli или PDO
  • postgresql: pg_set_client_encoding
  • sqlite (3): убедитесь, что он был скомпилирован с поддержкой unicode и intl

Некоторые другие Gotchas

  • Вы не можете использовать имена файлов Unicode с PHP и Windows, если вы не используете расширение третьей части.
  • Отправлять все в ASCII, если вы используете exec, proc_open и другие вызовы командной строки
  • Обычный текст - это не обычный текст, файлы имеют кодировки
  • Вы можете конвертировать файлы «на лету» с фильтром iconv

Я обновлю этот ответ, если что-то изменит добавленные функции и так далее.

5
задан Jens Erat 26 May 2013 в 01:18
поделиться

3 ответа

Есть несколько вещей, которые вам нужно изменить, которые вы можете сделать шаг за шагом.

  1. Объявите, что ваш Stack содержит Integer s, а не Character s.
  2. В коде, который читает ввод, полагайтесь на String s вместо Character s.
  3. Разбирайте операнды с помощью Integer.parseInt(). Это преобразует String s в Integer s. (Фактически, он преобразует их в int s, но в вашем случае это различие не имеет значения.)
  4. Установите разделитель сканера с помощью Scanner.useDelimiter() на \s+, это будет соответствовать последовательности любые пробельные символы.

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

2
ответ дан biziclop 4 September 2018 в 09:44
поделиться

вам не нужен сканер

, просто используйте BufferedReader для чтения файла, затем используйте его метод readLine, чтобы получить строку

. Затем используйте

String tokens[] = line.split("\\s+?") 

, и вы получите массив «токенов», которые могут быть обработаны в вашем коде.

, чтобы идентифицировать номер, вы можете использовать следующее регулярное выражение:

Pattern isNumber = Pattern.compile("^\\d+?$")
if (isNumber.matcher(token).matches()) {
    push(Integer.parseInt(token));
}
0
ответ дан jdevelop 4 September 2018 в 09:44
поделиться

Для того, чтобы tokenize вы можете использовать String.split() с одним пространством в качестве разделителя;

String[] inputs = input.split(" ");

Вот полное решение, которое я только что написал, что использует основанную на Stack в одиночном списке, чтобы сделать постфиксный калькулятор;

A - PostFixCalculator

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class PostFixCalculator {

    private static final String ADD = "+"; 
    private static final String SUB = "-";
    private static final String MUL = "*";
    private static final String DIV = "/";

    public void calculateFile(String fileName) throws IOException {
        BufferedReader br = null;
        StringBuilder sb = null;
        try {
            FileReader fileReader = new FileReader(fileName);
            br = new BufferedReader(fileReader);

            sb = new StringBuilder();
            String line = br.readLine();

            while (line != null) {
                sb.append(line);
                line = br.readLine();
            }

            String input = sb.toString();
            System.out.println(input + " = " + calculate(input));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            br.close();
        }
    }

    private int calculate(String input) {
        SinglyLinkedListStack<Integer> stack = new SinglyLinkedListStack<>();

        String[] inputs = input.split(" ");

        return handleCalculation(stack, inputs);
    }

    private static int handleCalculation(SinglyLinkedListStack<Integer> stack, String[] el) {
        int operand1, operand2;

        for(int i = 0; i < el.length; i++) {
            if( el[i].equals(ADD) || el[i].equals(SUB) || el[i].equals(MUL) || el[i].equals(DIV) ) {
                operand2 = stack.pop();
                operand1 = stack.pop();
                switch(el[i]) {
                    case ADD: {
                        int local = operand1 + operand2;
                        stack.push(local);
                        break;
                    }

                    case SUB: {
                        int local = operand1 - operand2;
                        stack.push(local);
                        break;
                    }

                    case MUL: {
                        int local = operand1 * operand2;
                        stack.push(local);
                        break;
                    }

                    case DIV: {
                        int local = operand1 / operand2;
                        stack.push(local);
                        break;
                    }
                }
            } else {
                stack.push(Integer.parseInt(el[i]));
            }
        }

        return stack.pop();
    }

}

B - SinglyLinkedListStack

public class SinglyLinkedListStack<T> {

    private int size;
    private Node<T> head;

    public SinglyLinkedListStack() {
        head = null;
        size = 0;
    }

    public void push(T element) {
        if(head == null) {
            head = new Node(element);
        } else {
            Node<T> newNode = new Node(element);
            newNode.next = head;
            head = newNode;
        }

        size++;
    }

    public T pop() {
        if(head == null)
            return null;
        else {
            T topData = head.data;

            head = head.next;
            size--;

            return topData;
        }
    }

    public T top() {
        if(head != null)
            return head.data;
        else
            return null;
    }

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    private class Node<T> {
        private T data;
        private Node<T> next;

        public Node(T data) {
            this.data = data;
        }

    }

}

C - Demo

import java.io.IOException;

public class PostFixCalculatorDemo {
    public static void main(String[] args) throws IOException {
        PostFixCalculator calc = new PostFixCalculator();
        calc.calculateFile("postfix.txt");
    }
}

D - Пример входного файла: «postfix.txt»

6 5 2 3 + 8 * + 3 + * 

E - демонстрационный выход

6 5 2 3 + 8 * + 3 + *  = 288
1
ответ дан Levent Divilioglu 4 September 2018 в 09:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: