Методы класса, не распознаваемые классом С++ Stack

Этот класс представляет собой стек, и я пытаюсь заставить пользователя вызывать функции, связанные со стеком. Однако никаких изменений вроде бы не вносится, так как при вызове функции отображения у меня весь стек заполняется нулями. Это происходит после помещения значений в стек.

#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.

Что такое отладчик?
PaulMcKenzie 18.12.2020 19:11

Включите предупреждения компилятора или прочитайте предупреждения, которые дает вам компилятор. У вас несколько ошибок. Например, что вы вернете, если pop обнаружит, что стек пуст?

PaulMcKenzie 18.12.2020 19:15

«Например, пользователь нажмет [...]» — это признак того, что у вас есть отвлекающие факторы, которые могут помешать отладке. Забудьте о пользователе. Не позволяйте пользовательскому вводу мешать вашим тестам с вашим минимально воспроизводимым примером. Если хочешь, чтобы push() звонили, то звони push(). Создайте копию своей программы для отладки, удалите ввод-вывод из этой копии и просто перечислите функции и данные, необходимые для воспроизведения вашей проблемы. Возможно, уменьшите свою основную функцию до чего-то вроде int main() { Stack stack; stack.push(2); stack.display(); }.

JaMiT 18.12.2020 19:48

Программа все равно глючит, даже если исправить ошибку ==. Если пользователь с самого начала выбирает вариант 2, ваша программа сталкивается с неопределённым поведением, поскольку функция int pop() не возвращает значение, если стек пуст. Отсутствие возврата значения, когда оно должно возвращать значение, является неопределенным поведением. Неопределенное поведение означает, что программа может аварийно завершать работу, а не аварийно завершать работу, вызывать повреждение памяти или казаться «работающей». Вам нужно переделать функцию pop, чтобы она работала правильно, когда стек пуст.

PaulMcKenzie 19.12.2020 00:00
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
4
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле вы никогда ничего не кладете в стек:

        void push(int val)  {
            if (isFull())   {
                cout <<"stack overflow" << endl;
            }
            else  {
                top++;
                array[top] == val;      // Change == to =
            }    
        } 

В настоящее время вы проводите сравнение.

Есть и другие фатальные ошибки. Сможете ли вы их заметить?

PaulMcKenzie 18.12.2020 19:15

Я не вижу никаких фатальных ошибок, просто некоторые сомнительные варианты дизайна. peek() и change() не выполняют проверку границ для аргумента pos, что нормально, за исключением случая, когда входные данные для этих функций исходят от пользователя и могут быть любыми — НО даже это нормально, поскольку это явно для целей обучения. Я также думаю, что проблематично то, что peek() возвращает 0, если стек пуст — я бы предпочел использовать для этого исключения или утверждения, в зависимости от того, как будет использоваться структура. О каких фатальных ошибках вы говорите?

MorningDewd 18.12.2020 19:24

Посмотрите внимательно на функцию pop и на условие пустого стека. Смотрите комментарий, который я сделал в основной теме. Знаете ли вы, что произойдет, если вы ничего не вернете из функции, которая должна возвращать значение?

PaulMcKenzie 18.12.2020 19:25

Единственное, что я вижу, это то, что pop() не возвращает значение, если isEmpty() возвращает true. isEmpty() сам по себе выглядит нормально.

MorningDewd 18.12.2020 19:32

Отсутствие возврата значения, когда функция должна возвращать значение, является неопределенным поведением. Таким образом, все, что нужно сделать, это выбрать пункт 2 в меню, и программа находится в состоянии неопределенного поведения. Кажется, вы не поняли всей сути этого фатального недостатка.

PaulMcKenzie 18.12.2020 23:50

Другие вопросы по теме