Стеки и очереди - это относительно простые структуры данных. При правильном использовании они обычно будут иметь временную сложность O (1) для всех реализаций. Вам просто нужно получить данные с начала очереди или стека и вставить новые данные либо сзади, либо спереди соответственно. Следовательно, вам не нужно искать в структуре данных, потому что вы знаете, куда вставлять и удалять данные. https://www.bigocheatsheet.com/
Что касается простоты кода и обслуживания, создание кода с нуля, скорее всего, будет худшим. Вам придется делать всю работу самостоятельно, а все, что ломается, придется самостоятельно исправлять. (Честно говоря, мне нравится пытаться создавать структуры данных самостоятельно, потому что я могу многое узнать о сложных деталях, несмотря на очевидные недостатки.)
Наследование не обязательно, если вам не нужно добавлять дополнительные функции в список для вашего конкретного варианта использования. Если вам не нужно ничего менять, то в лучшем случае вы просто используете стандартный список, а в худшем случае вы, вероятно, просто делаете дополнительную работу.
Простое использование обычного списка имеет то преимущество, что оно уже создано для вас и поддерживается другими программистами. Поэтому, вероятно, это лучший вариант.
Однако в C ++ есть шаблон очереди и стека, который, вероятно, будет лучшим для большинства случаев использования, поэтому, если вам не нужно ничего особенного, я бы просто использовал его.
Надеюсь, это будет полезно для вас.