Ваш код имеет неопределенное поведение.
Рассмотрим, например, функцию push
//push, append to front of array
bool push(int num) {
if (position >= 20) return false;
position += 1;
QUE[position] = num;
return true;
}
и для простоты предположим, что массив QUE
имеет только один элемент, который объявлено как
int QUE[1];
В этом случае очередь может содержать только одно переданное значение из-за емкости массива.
Итак, после первого вызова push
like
push( 0 );
у вас будет, что position
равно 0
, а очередь содержит значение 0
.
Если вызвать функцию второй раз, например,
push( 1 );
условие в функции
if (position >= 1) return false;
не будет оцениваться как истинное, потому что текущее значение position
равно 0
. В результате функция попытается записать значение 1
в недопустимое место массива QUE[1]
.
Массив содержит только один элемент, но функция позволяет записать еще один элемент.
Теперь давайте рассмотрим функцию pop
bool pop() {
if(QUE[retrieve] == 0) return false;
int hold = QUE[retrieve];
printf("%d",hold);
retrieve ++;
return hold;
}
и ту же очередь, которая уже содержит только один элемент, равный 0
(см. Предыдущий вызов push( 0 )
).
Поскольку условие оператора if
if(QUE[retrieve] == 0) return false;
оценивается как истинное (очередь действительно содержит значение 0, помещенное в очередь раньше), тогда функция вернет false, как если бы очередь пуста, хотя это не так. пусто.
Итак, эта функция недействительна.
Более того, в l oop в основном
while ((t = pop()) != 0) {
printf("t = %d\n",t);
}
кажется, что вы пытаетесь вывести значения, хранящиеся в очередь. Однако функция не возвращает таких значений. Из-за возвращаемого типа bool
, который является typedef для C стандартного типа _Bool
, любое возвращаемое значение преобразуется либо в 0
, либо в 1
.
Таким образом, программа в целом неверна .