#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, которое может иметь несколько ключей для разных значений.