«верхнее» значение не изменится, сколько раз я пушу или выталкиваю стек - PullRequest
1 голос
/ 21 сентября 2019

Я реализовывал стек, используя динамический массив.Моя идея проста: я хочу, чтобы пользователь ввел желаемую длину, а затем создал стек с этой длиной.Затем он / она может нажать, выдать целое число;увидеть верхнее и максимальное значение (для целей отладки);проверьте, является ли он полным или пустым (также для отладки).Он / она может толкать до тех пор, пока стек не заполнится, затем должен выдвинуться, он / она может выдвинуться до тех пор, пока он не опустеет, а затем должен нажатьЯ использую do while и switch, чтобы облегчить отладку и манипулирование.Но когда я начал тестировать, мой главный атрибут моего стекового класса оставался 0, сколько раз я когда-либо толкал или выдавливал.Я пытался найти ошибку, но все еще не нашел ее.

Вот мой код:

#include <cstdio>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;

class Stack {
    int top;
    int max; // max index
    int *data;
    public:
        Stack(int length);
        int isEmpty();
        int isFull();
        int push(int n);
        int pop();
        int getTop(void);
        int getMax(void);
        ~Stack(void);
};

Stack::Stack(int length){
    top = 0;
    max = length;
    data = new int[length+1];
}
int Stack::isEmpty(void){
    return top==0;
}
int Stack::isFull(void){
    return top==max;
}
int Stack::push(int n){
    if(!isFull()){
    data[++top] = n;
    return 1;
    }
    else return 0;

}
int Stack::pop(void){
    if(!isEmpty()){
        return data[top--];
    }
    else return -911; //rare and indicative number
}
int Stack::getTop(void){
    return top;
}
int Stack::getMax(void){
    return max;
}
Stack::~Stack(void){
    delete[] data;
}

int main(void){
    int length = 0;
    cout << "Enter stack's length': "; cin >> length;
    Stack list(length);
    char lock;
    do{
        cout << "1. push" << endl;
        cout << "2. pop" << endl;
        cout << "3. show top index" << endl;
        cout << "4. show max index" << endl;
        cout << "5. isFull?" << endl;
        cout << "6. isEmpty?" << endl;
        cout << "0. Quit" << endl;
        scanf("%d", &lock);
        switch(lock){
            case 1:
                int temp;
                cout << "Enter an integer: ";
                cin >> temp;
                printf(list.push(temp)?"success\n":"fail\n");
                break;
            case 2:
                cout << "Top's data: " << list.pop() << endl;
                break;
            case 3:
                cout << list.getTop() << endl;
                break;
            case 4:
                cout << list.getMax() << endl;
                break;
            case 5:
                printf(list.isFull()?"True\n":"False\n");
                break;
            case 6:
                printf(list.isEmpty()?"True\n":"False\n");
                break;
            case 0: break;
            default:
                cout << "Not an available work!" << endl;
        }
    } while (lock!= 0);

    return 0;
}

1 Ответ

0 голосов
/ 21 сентября 2019

У вас легкое повреждение памяти.Причина:

q58036810.cpp:71:21: warning: format specifies type 'int *' but the argument has type 'char *' [-Wformat]
        scanf("%d", &lock);
               ~~   ^~~~~
               %s

Когда вы вводите числа в меню, оно слишком велико для lock и поэтому перезаписывает память, которая хранит top внутри list.Измените char lock на int lock, и проблема должна исчезнуть.В будущем всегда соблюдайте предупреждения и учитывайте их.Кроме того, по природе этой проблемы она не будет постоянно воспроизводимой (т. Е. На моей машине она работает нормально).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...