Как отсортировать список специальных символов так, как я хотел в c

#c #sorting

#c #сортировка

Вопрос:

У меня есть функция с именем OperatorSorter, и я в основном хочу отсортировать список специальных символов. например:

 ['-', '*', '/', ' ', '^'] => ['^', '*', '/', '-', ' ']
 

Что я хочу сделать, так это создать калькулятор, и он создаст список операторов. Но он должен упорядочивать операции и сортировать их.
Но я не могу использовать их ascii из-за того, что они не в порядке таким образом.
Может кто-нибудь дать мне хороший способ сортировки для сортировки этого в c ?

Комментарии:

1. Вы должны закодировать сравнение вручную. Например, с некоторой структурой данных, которая сопоставляет каждый символ с весом, который он должен иметь при сортировке.

2. этот вопрос выглядит как верхушка айсберга актуальной проблемы. Предоставьте более подробную информацию.

Ответ №1:

Что вам нужно, так это своего рода отображение. Например, рассмотрим следующее, используя std::map :

 std::map<char, int> sortWeigths { {'^', 0} , {'*', 1} , {'/', 1} , {'-', 2} , {' ', 2} };
 

Где некоторые операторы имеют одинаковые веса.
Затем вы можете использовать пользовательский компаратор, подобный этому:

 bool CompareOperators(char a, char b)
{   
    return sortWeigths[a] < sortWeigths[b];
}
 

Это всего лишь приблизительный план, и я надеюсь, что вы поняли идею.

Обратите внимание, что при использовании std::sort идентичных элементов могут меняться позиции. Например, ввод ['-', '*', '/'] может закончиться как или ['*', '/', '-'] или [ '/', '*', '-'] . Если это важно, подумайте std::stable_sort .

Ответ №2:

Предполагая, что вы сортируете только эти символы. Если вы сопоставляете (переводите) первый символ, скажем, «a», следующий в вашем предпочтительном порядке — «b», рядом с «c» и т. Д., Тогда вы можете использовать обычную сортировку. После завершения сортировки вы сопоставляете символы обратно. Если два ваших символа имеют одинаковое значение, вам нужно обрабатывать эти случаи отдельно.

Комментарии:

1. Но есть проблема, когда * и / имеют одинаковый порядок выполнения

2. Но вы не можете сопоставить символы обратно, когда два были сопоставлены с одним и тем же символом для сортировки. Допустим, * и / оба будут сопоставлены с ‘b’, потому что они должны считаться равными при сортировке. Теперь у вас нет способа определить, что было * и что было / . Может быть, это не важно, просто нужно подумать.

Ответ №3:

Или вы можете создать карту, назначающую ключи каждому символу. Таким образом, вы можете добавлять новые символы, если требуется. Следующие пары ключ-значение уже отсортированы по ключу.

 #include <map>
std::map<int,char> symbol_map = {{1,'^',}, {2,'*'}, {3,'/'}, {4,'-'}, {5,' '}};
std::multimap<int,char> symbol_map2 = {{1,'^',}, {2,'*'}, {2,'/'}, {3,'-'}, {3,' '}};
 

Комментарии:

1. Да, но это проблема, когда * и / имеют одинаковую приоритетность

2. Используйте правило BODMAS или создайте multimap, которое может иметь несколько ключей для разных значений.