Этот класс представляет собой стек, и я пытаюсь заставить пользователя вызывать функции, связанные со стеком. Однако никаких изменений вроде бы не вносится, так как при вызове функции отображения у меня весь стек заполняется нулями. Это происходит после помещения значений в стек.
#include <iostream>
using namespace std;
class Stack {
public:
int array[5];
int top;
Stack() {
top = -1;
for (int i = 0; i < 5; ++i) {
array[i] = 0;
}
}
bool isEmpty() {
if (top == -1) {
return true;
}
return false; }
bool isFull() {
if (top == 4) {
return true;
}
return false;
}
void push(int val) {
if (isFull()) {
cout <<"stack overflow" << endl;
}
else {
top++;
array[top] == val;
}
}
int pop() {
if (isEmpty()) {
cout << "stack underflow" << endl;
}
else {
int val = array[top];
array[top] = 0;
top--;
return val;
}
}
int count() {
return(top + 1);
}
int peek(int pos) {
if (isEmpty()) {
cout << "stack underflow";
return 0;
}
else {
return array[pos];
}
}
void change(int pos, int val) {
array[pos] = val;
}
void display() {
for (int i = 4; i >= 0; --i) {
cout << array[i];
}
}
};
int main() {
Stack stack;
int option, position, value;
do
{
cout << "What operation do you want to perform? Select Option number. Enter 0 to exit." << endl;
cout << "1. Push" << endl;
cout << "2. Pop" << endl;
cout << "3. isEmpty()"<< endl;
cout << "4. isFull()"<< endl;
cout << "5. peek()"<< endl;
cout << "6. count()"<< endl;
cout << "7. change()"<< endl;
cout << "8. display()"<< endl;
cout << "9. Clear Screen"<< endl<< endl;
cin >> option;
switch(option) {
case 1:
cout << "Enter item to push onto stack: " << endl;
cin>>value;
stack.push(value);
break;
case 2:
cout << "Popping from stack: " << stack.pop() << endl;
break;
case 3:
if (stack.isEmpty()) {
cout << "True" << endl;
}
else {
cout << "False" << endl;
}
break;
case 4:
if (stack.isFull()) {
cout << "True" << endl;
}
else {
cout << "False" << endl;
}
break;
case 5:
cout << "Enter position to peek" << endl;
cin >> position;
cout << stack.peek(position) << endl;
break;
case 6:
cout << stack.count() << endl;
break;
case 7:
cout << "Enter position followed by value: " << endl;
cin >> position >> value;
cout << "Position changed" << endl;
break;
case 8:
stack.display();
break;
case 9:
system("cls");
break;
}
}
while (option != 0);
return 0;
}
Например, пользователь нажмет 1, чтобы вызвать push() и отправить какое-то входное значение. Затем они вводят 8 для вызова дисплея, и он должен отображать это входное значение в стеке, но печатает 00000.
Включите предупреждения компилятора или прочитайте предупреждения, которые дает вам компилятор. У вас несколько ошибок. Например, что вы вернете, если pop обнаружит, что стек пуст?
«Например, пользователь нажмет [...]» — это признак того, что у вас есть отвлекающие факторы, которые могут помешать отладке. Забудьте о пользователе. Не позволяйте пользовательскому вводу мешать вашим тестам с вашим минимально воспроизводимым примером. Если хочешь, чтобы push() звонили, то звони push(). Создайте копию своей программы для отладки, удалите ввод-вывод из этой копии и просто перечислите функции и данные, необходимые для воспроизведения вашей проблемы. Возможно, уменьшите свою основную функцию до чего-то вроде int main() { Stack stack; stack.push(2); stack.display(); }.
Программа все равно глючит, даже если исправить ошибку ==. Если пользователь с самого начала выбирает вариант 2, ваша программа сталкивается с неопределённым поведением, поскольку функция int pop() не возвращает значение, если стек пуст. Отсутствие возврата значения, когда оно должно возвращать значение, является неопределенным поведением. Неопределенное поведение означает, что программа может аварийно завершать работу, а не аварийно завершать работу, вызывать повреждение памяти или казаться «работающей». Вам нужно переделать функцию pop, чтобы она работала правильно, когда стек пуст.
На самом деле вы никогда ничего не кладете в стек:
void push(int val) {
if (isFull()) {
cout <<"stack overflow" << endl;
}
else {
top++;
array[top] == val; // Change == to =
}
}
В настоящее время вы проводите сравнение.
Есть и другие фатальные ошибки. Сможете ли вы их заметить?
Я не вижу никаких фатальных ошибок, просто некоторые сомнительные варианты дизайна. peek() и change() не выполняют проверку границ для аргумента pos, что нормально, за исключением случая, когда входные данные для этих функций исходят от пользователя и могут быть любыми — НО даже это нормально, поскольку это явно для целей обучения. Я также думаю, что проблематично то, что peek() возвращает 0, если стек пуст — я бы предпочел использовать для этого исключения или утверждения, в зависимости от того, как будет использоваться структура. О каких фатальных ошибках вы говорите?
Посмотрите внимательно на функцию pop и на условие пустого стека. Смотрите комментарий, который я сделал в основной теме. Знаете ли вы, что произойдет, если вы ничего не вернете из функции, которая должна возвращать значение?
Единственное, что я вижу, это то, что pop() не возвращает значение, если isEmpty() возвращает true. isEmpty() сам по себе выглядит нормально.
Отсутствие возврата значения, когда функция должна возвращать значение, является неопределенным поведением. Таким образом, все, что нужно сделать, это выбрать пункт 2 в меню, и программа находится в состоянии неопределенного поведения. Кажется, вы не поняли всей сути этого фатального недостатка.