Итак, я отредактировал свой код, но у меня все еще есть две проблемы:
Но вот мой код в первую очередь:
#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 значений.
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
элементы, и вы не можете получить больше элементов, когда он пуст. Вы должны поддерживать эти инварианты.
Я не вижу, где был создан объект типа стека и как инициализировался элемент данных top.
Также учтите, что функция-член push не проверяет, есть ли попытка добавить элемент за пределы массива.
Вы должны определить объект следующим образом
stack S = { {}, -1 };
else cout<<"Stack is full!!!"<<endl; S.top--;
идентичен:
else
{
cout<<"Stack is full!!!"<<endl;
}
S.top--;
как правило, старайтесь избегать: писать if / else без фигурных скобок и избегать написания более одной строки кода в одной строке.
Ошибка в следующем:
stack S;
S.top = -1;
for(int i = 0; i < 5; i++)
{
S.data[i] = 0;
}
[/ NOEDIT]