Ошибка при реализации стека
Почему он сохраняет только 1 элемент, и именно последний который был дан с помощью функции push
template <typename T>
bool Stack<T>::isempty() {
return size == 0;
}
template <typename T>
bool Stack<T>::push(T& item) {
T* buffer; // буффер для данных из stack
buffer = stack;
stack = new T[size + 1]; // выделяем память на 1 элемент больше чем было
if (stack == NULL) {
cout << "Error\n";
return false;
}
for (int i = 0; i < size - 1; i++) {
stack[i] = buffer[i];
}
stack[size] = item;
size++; // увеличваем количество элементов
if (size > 0)
delete[] buffer;
return true;
}
template <typename T>
int Stack<T>::size_stack() {
return size;
}
template<typename T>
T Stack<T>::pop() {
if (size == 0) // стек пуст
return 0;
size--;
return stack[size];
}
template<typename T>
T Stack<T>::head() {
if (size == 0)
return 0;
return stack[size - 1];
}
template<typename T>
void Stack<T>::Print() {
T* buff; // указатель для продвижения по стеку
buff = stack;
cout << "Stack" << endl;
if (size == 0)
cout << "Stack is empty" << endl;
for (int i = 0; i < size; i++) {
cout << "items[" << i << "] = " << *buff << endl;
}
cout << endl;
}
Ответы (2 шт):
cout << "items[" << i << "] = " << *buff << endl; - попробуйте << *buff++ <<, а то у вас указатель всегда на один и тот же элемент указывает. Или << buff[i] <<
Но только вот у вас несообразностей все равно много.
Например, вы не сможете сделать в Stack<int> - push(1), потому что передаете неконстантную ссылку.
push() у вас возвращает bool, а pop в случае неприятности - 0. А Если этот 0 нельзя привести к типу T? А если это int - то возврат 0 означает, что там был 0, или что там не было ничего? Где же логика? (О безопасности в смысле исключений промолчу - но задумайтесь: в стандартном стеке есть отдельно функция возврата элемента на вершине, и отдельно - ничего не возвращающая функция pop. И это неспроста :))
Об эффективности вам уже рассказали в комментариях; добавлю только, что при pop вы саму память не уменьшаете. Представим, что у вас было в стеке 100 элементов. Вы оттуда забрали 100. Итог? Есть заполненный наполовину массив. Есть место для 100 элементов - но вы все равно будете при добавлении выполнять выделение массива под 101 элемент... :( Опять - не логичнее ли следить, сколько есть места, сколько занято - и выделять память, когда она нужна, а не просто так...
@Harry все хорошо написал, вот только он не написал, почему же в стеке получается мусор (собственно сам вопрос). А он спрятан в этой конструкции
for (int i = 0; i < size - 1; i++) {
stack[i] = buffer[i];
}
последний элемент не копируется. Таким образом в нем будет мусор. А так как при каждой вставке не копируется предыдущий элемент, то весь стек, кроме вставляемого элемента содержит мусор.
Исправить просто
for (int i = 0; i < size; i++) {
stack[i] = buffer[i];
}
или если гулять так гулять, то даже так
memcpy(stack, buffer, sizeof(T)*size);