C ++ - 堆叠数组中的问题

时间:2017-04-04 02:00:33

标签: c++ visual-studio-2015 stack

我一直在努力弄清楚为什么我的代码在过去几个小时内无法正常工作。除非是我不知道的东西,否则一切看起来都很完美。我问过我的教授,但他似乎也无法弄明白。此代码将完全忽略 push 成员函数中的if else语句,并在达到限制后继续推送(在这种情况下,它是5个元素)。当它超过第5个元素时,我检查顶部,它显示第一个实现(元素0)。我尝试通过范围分辨率切换类外的成员函数来改变我的代码,但它仍然没用。我将非常感激不同的一双眼睛。

#include <iostream>
#include <cctype>
using namespace std;

class Stack
{
private:
    static const int size = 5;
    double myarr[size];
    int t;

public:
    Stack() { t = -1; }
    void push(double element);
    void pop();
    void top();
    void menu();
};

void Stack::push(double element)
{
    if (t < size) {
        t++;
        myarr[t] = element;
    }
    else
        cout << "Stack Limit Reach !!!" << endl;
}

void Stack::pop()
{
    if (t >= 0) {
        cout << "Element : " << myarr[t] << " was popped off the Stack " << endl;
        t--;
    }
    else
        cout << "No more elemnts in the Stack !!!" << endl;
}

void Stack::top()
{
    if (t >= 0) {
        cout << "Element : " << myarr[t] << " is at the top of the Stack " << endl;
    }
    else
        cout << "No more elemnts in the Stack !!!" << endl;
}

void Stack::menu()
{
    char choice = 'y';
    int pick;
    double elem;

    while (toupper(choice) == 'Y');//while(choice == 'y' || choice == 'Y');
    {
        cout << "1. Push" << endl;
        cout << "2. Pop" << endl;
        cout << "3. Top" << endl;
        cout << "4. Exit" << endl;
        cin >> pick;

        switch (pick)
        {
        case 1:
            cout << "Enter the element: ";
            cin >> elem;
            cout << endl;
            push(elem);
            break;
        case 2:
            pop();
            break;
        case 3:
            top();
            break;
        case 4:
            choice = 'N';
            break;

        default:
            cout << "Please select 1-4" << endl;
        }
        system("pause");
    }


}

int main()
{
    Stack obj;
    obj.menu();

};

4 个答案:

答案 0 :(得分:0)

在您的示例代码中,堆栈的size为5(这意味着数组myarr具有有效索引04)。

void Stack::push(double element)
{
    if (t < size) {
        t++;
        myarr[t] = element;
    }
    else
        cout << "Stack Limit Reach !!!" << endl;
}

考虑t此处4时的情况。 if测试为true,因此输入要添加到myarr的块。首先发生的事情是你增加t,现在是5。然后使用它作为索引将值存储到myarr,这超出了界限。

尝试类似:

void Stack::push(double element)
{
    if (t < size) {
        myarr[t++] = element;
    }
    else
        cout << "Stack Limit Reach !!!" << endl;
}

答案 1 :(得分:0)

你跳过myarr [0]然后第5个元素保存到myarr [5],这是myarr的第6个元素! (通过索引访问数组的元素在C ++中为零)

变化:

    Stack() { t = -1; }

为:

    Stack() { t = 0; }

    if (t < size) {
    t++;
    myarr[t] = element;

为:

    if (t < size) {
        myarr[t++] = element;

答案 2 :(得分:0)

您允许将6个元素推入堆栈,并且只有5个空间。

变化:

 if (t < size) {
   t++;

为:

 if (t < size-1) {
    t++;

答案 3 :(得分:0)

当你搜索你没有得到的顶级元素时,我理解你的问题,因为每当堆栈变得满满的时候: -

假设您正在插入(下面提到的代码)第4个索引中的第5个元素,它将被插入并且t的值由于t ++而增加到5。

    void Stack::push(double element)
{
    if (t < size) {
        t++;
        myarr[t] = element;
    }
    else
        cout << "Stack Limit Reach !!!" << endl;
}

但同时当你调用top()函数时它检查索引,显然5大于0,所以它进入循环但索引5包含'\ 0' 字符因此编译器存在歧义

    void Stack::top()
{
    if (t >= 0) {
        cout << "Element : " << myarr[t] << " is at the top of the Stack " << endl;
    }
    else
        cout << "No more elemnts in the Stack !!!" << endl;
}

所以上面代码所需的更改只是通过说编译器如果堆栈已满而将t值递减1来放置if语句

void Stack::top()
{
    if (t >= 0) {
            if(t==size){t--;}
        cout << "Element : " << myarr[t] << " is at the top of the Stack " << endl;
    }
    else
        cout << "No more elemnts in the Stack !!!" << endl;
}

这可能会给你正确的结果