Member 12606619 Ответов: 2

Объясняя проблему преформации в данном блоке кода?


Честно говоря, я решил этот вопрос, но чтобы убедиться, что я сделал это правильно, мне нужно спросить вас, ребята, считаете ли вы, что я сделал это правильно.

(ля)
Объясните кратко, но ясно, что делает приведенная ниже программа на C++. Обратите внимание, что используются шаблонные версии ADT стека и очереди, но в остальном их функциональность и API одинаковы.

void main() {
    	char inChar, stackChar, queueChar;
    	StackType<char> stack;
    	QueueType<char> queue;
    	bool check = true;
    	cout << "Enter a string and press return." << endl;
    	cin.get(inChar);
    	while (inChar != '\n') {
    		stack.Push(inChar);
    		queue.Enqueue(inChar);
    		cin.get(inChar);
    	}
    	while (check && !queue.IsEmpty()) {
    		stack.Top(stackChar); stack.Pop();
    		queue.Dequeue(queueChar);
    		if (stackChar != queueChar) check = false;
    	}
    	if (check) cout << "Yes it is!" << endl;
        else cout << "No it's not." << endl;
    }


- Я думаю, что данная программа на c++ проверяет, является ли данная строка палиндромом, не помещая строку как в стек, так и в очередь. используя операции pop и dequeue, получите первый и последний символы и проверьте, равны ли они, если не выходите.

(b) Объясните, какие проблемы с производительностью имеет вышеприведенная программа, и предложите, как это исправить. Никакого кода не требуется; просто кратко объясните, что вы будете делать.

- Здесь необходимо инициализировать символьные переменные stackChar и queueChar , поскольку они используются для функций pop и dequeue, и после этого значения должны быть обновлены текущими верхними и первыми значениями стека и очереди.

Я буду очень признателен!

Что я уже пробовал:

Отвечая на вопросы, приведенные выше.

2 Ответов

Рейтинг:
1

Sergey Alexandrovich Kryukov

Вы не совсем правы.

Переменная stackChar и queueCharне нужно инициализировать. Предполагается, что значения присваиваются им при извлечении и удалении данных из очереди. Более того, если бы вы были правы, это не имело бы ничего общего с производительностью, скорее, если бы означало несуществующий код или, скажем, ненадежный код, результаты которого могут зависеть от некоторых случайных факторов (таких как разные результаты выполнения под отладчиком и без отладчика). На самом деле это не так. Кстати, в приличном языке программирования такие проблемы невозможны (извините, но нет, я не думаю, что C ++ приличный, даже близко, даже с точки зрения хорошей низкоуровневой поддержки) - неинициализированные переменные либо отлавливали ошибки компиляции , или компилятор выясняет, что в этом нет необходимости.

Итак, резюме: 1) проблема, на которую вы указали, не является проблемой, 2) она не будет связана с производительностью.

Лучший вердикт по производительности будет таков: использование только массива будет быстрее. Ключ здесь таков: нет необходимости использовать какой-либо сбор данных переменного размера. Пользователь вводит тестовую фразу сразу, так что ваш код может создать весь массив сразу, что устраняет все возможные проблемы с производительностью; нет ничего похожего на перераспределение; и во всех других аспектах массив будет самым быстрым. В целом, качество кода ... так себе…

Теперь о первой части вашего ответа: "проверка того, является ли данная строка палиндромом". Это было бы верно, если бы ваше интуитивное ожидание того, что этот код действительно делает, было истинным. В других работах ответ хорош, как только вы не говорите "строго говоря".

Но что это за фрагмент кода, строго говоря? Строго говоря, это… кто знает, что. Что-то неопределенное. Почему? Потому что нет никаких указаний на то, что StackType и QueueType действительно реализуйте стек "обычных" универсальных (шаблонных) структур данных "стек" и "очередь", чтобы реализация была правильной, чтобы функции, которые вы используете, были такими, какие вы ожидаете, и так далее. Строго говоря, имя типа или тип шаблона не несет никакой информации о том, что он действительно делает. Код не показан, а формулировка задачи ни слова не говорит о том, что это такое. Может быть, я бы и не придирался к этому, но использование слова "тип" в названии типа говорит о хвосте; это не выглядит как разумное или даже адекватное поведение разработчика. Кстати, тогда имена стандартного типа C++, реализующего стек и очередь, являются: std::stack и std::queue; они являются шаблонными классами:
std:: стек,
очереди — Справочник по c++ .

Поэтому я бы не очень доверял программисту, который написал "StackType "или"QueueType". :-)

—СА


Рейтинг:
0

Patrice T

Я согласен с вами в ответе А, но в ответе Б.

Подсказка: подумайте, к чему добавляются структуры стека и очереди при добавлении и удалении данных.


Sergey Alexandrovich Kryukov

А ты? Затем мольбы см. Решение 2. :-)
—СА

Patrice T

Просто быстрый ответ :)

Sergey Alexandrovich Kryukov

Я знаю. Вы понимаете, к чему я клоню? Во всяком случае, ваш вопрос не объясняет, что не так с Б. Последнее предложение относится к А.
—СА

Patrice T

Я думал о выделении памяти и изменении размера структуры.