Почему происходит сбой этого кода при тестировании стека?

Итак, я отредактировал свой код, но у меня все еще есть две проблемы:

Но вот мой код в первую очередь:

    #include <iostream>
using namespace std;

struct stack
{
int data[5];
int top;
};

void push (int a, stack &S)
{
S.top++;

if (S.top<5)
{
S.data[S.top]=a;
}
else cout<<"Stack is full!!!"<<endl; S.top--;
}int pop(stack &S)
{
if (S.top==-1)
{
cout<<"Stack is empty!"<<endl;
}
else
{
int temp=S.data[S.top];
S.data[S.top]=NULL;
S.top--;
return temp;
}
}

bool isEMPTY(stack &S)
{
if (S.top==-1)
return true;
else return false;
}
bool isFULL(stack &S)
{
if (S.top==5)
return true;
else return false;
}int main()
{
stack S = { {}, -1 };

push(5,S); cout<<"5 is pushed \n"<<endl;
push(3,S); cout<<"3 is pushed \n"<<endl;
push(1,S); cout<<"1 is pushed \n"<<endl;
push(2,S); cout<<"2 is pushed \n"<<endl;
push(6,S); cout<<"6 is pushed \n"<<endl;
push(7,S); cout<<"7 is pushed \n"<<endl;

cout<<pop(S)<<"is popped\n"<<endl;
cout<<pop(S)<<"is popped\n"<<endl;
cout<<pop(S)<<"is popped\n"<<endl;

return 0;
}

Итак, первая проблема заключается в том, что, когда я выскакиваю, я получаю «Совершенно случайное значение», и это не похоже на LIFO.

Во-вторых, я на самом деле намеревался вставить 6 значений, когда у меня уже было максимальное значение = 5, так что вывод фактически показал мне 6 значений.

0

Решение

stack S;

поскольку stack POD, строка выше не инициализирует член top, Таким образом, используя неинициализированный top в push а также pop Функция вызывает неопределенное поведение.

Напишите это:

stack S {}; //must be compiled in C++11 mode, else write : stack S = stack();

Это значение инициализирует S и его члены, что означает, top инициализируется в 0, В остальном коде все еще могут быть другие проблемы, но, по крайней мере, вы исправили проблемы с правильной инициализацией. Если вы работаете с 0 в качестве начального значения topВы пишете логику push а также pop соответственно!

Как только вы это исправите, проверьте значение top до толкая а также внезапная значения из стека, поскольку массив-член может иметь не более 5 элементы, и вы не можете получить больше элементов, когда он пуст. Вы должны поддерживать эти инварианты.

2

Другие решения

Я не вижу, где был создан объект типа стека и как инициализировался элемент данных top.
Также учтите, что функция-член push не проверяет, есть ли попытка добавить элемент за пределы массива.

Вы должны определить объект следующим образом

stack S = { {}, -1 };
1

 else cout<<"Stack is full!!!"<<endl; S.top--;

идентичен:

else
{
cout<<"Stack is full!!!"<<endl;
}
S.top--;

как правило, старайтесь избегать: писать if / else без фигурных скобок и избегать написания более одной строки кода в одной строке.

1

Ошибка в следующем:

  1. stack s; // вы определяете локальную переменную «s» без инициализации.
  2. push (5, s); // передать не подсвеченные «s» в функцию «push», при отладке вашего кода «s.top» — это не ожидаемое «-1», но какое-то значение невероятно ~ (часто очень большое) чем 5), так что ваша операция push не удалась!

stack S;
S.top = -1;
for(int i = 0; i < 5; i++)
{
S.data[i] = 0;
}

[/ NOEDIT]

0
По вопросам рекламы [email protected]