“最高”价值不会改变我推送或弹出堆栈的次数

时间:2019-09-21 02:27:10

标签: c++ stack

我正在使用动态数组实现堆栈。我的想法很简单:我希望用户输入所需的长度,然后创建具有该长度的堆栈。然后他/她可以推送,弹出一个整数;查看最高和最高价值(用于调试);检查它是否已满或为空(也用于调试)。他/她可以推动直到堆叠已满然后必须弹出,他/她可以弹出直到其为空然后必须推动。我使用do while和switch使其更容易调试和操纵。 但是,当我开始测试时,我的Stack类的最高属性仍然为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 :(得分:0)

您有轻微的内存损坏。原因:

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,问题应该消失了。将来,请始终编译警告并留意它们。同样,由于这个问题的性质,它也不会始终如一地再现(即,在我的机器上似乎可以正常工作)。