我正在编写一个队列数据结构,一旦在堆栈中返回该值,我就无法在数组中保留整数的值。pop 函数正在做它需要做的事情,但为什么主要不获取该信息?我错过了什么?马洛克?
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
int QUE[20];
const int EMPTY = -1;
int position = -1;
int retrieve = 0;
//push, append to front of array
bool push(int num) {
if (position >= 20) return false;
position += 1;
QUE[position] = num;
return true;
}
//pop from top of array
bool pop() {
if(QUE[retrieve] == 0) return false;
int hold = QUE[retrieve];
printf("%d",hold);
retrieve ++;
return hold;
}
// PEEK
// First in first out
int main() {
push(12);
push(90);
push(22);
int t;
//why does pop equal 1
while ((t = pop()) != 0) {
printf("t = %dn",t);
}
}
您正在尝试在同一值中传递两种不同类型的信息——布尔状态"pop 成功"和从队列中弹出的整数值。这很糟糕;不匹配导致您将返回类型声明为bool
,这会导致结果值t
为零或 1(分别作为false
或true
转换为int
类型(。
尝试将操作拆分为测试和获取阶段,例如:
bool anyItemInQueue()
{
return _add_appropriate_condition_here_;
}
int main()
{
....
while( anyItemInQueue() )
{
int t = pop();
.... // use t here
}
}
或者传递另一个变量来接收另一个值:
bool pop(int *result)
{
if( anyItemInQueue() )
{
*result = QUE[retrieve];
.... // some housekeeping here
return true; // success status
}
return false; // failure status
}
int main()
{
....
int t;
while( pop( & t ) ) // point at t to receive the popped value
{
.... // use t here
}
}
这是因为任何非零值都转换为bool
true,然后转换为整数。bool
true的整数值为1
您的代码具有未定义的行为。
例如,让我们考虑函数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
喜欢之后
push( 0 );
您将拥有该position
等于0
并且队列包含值0
.
如果第二次调用该函数,例如
push( 1 );
函数中的条件
if (position >= 1) return false;
不会计算为 true,因为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;
计算结果为 true(队列确实包含提前推送到队列上的值 0(,则函数将返回 false,就好像队列为空一样,尽管它不为空。
所以这个函数是无效的。
此外,在主回路中
while ((t = pop()) != 0) {
printf("t = %dn",t);
}
您似乎正在尝试输出存储在队列中的值。但是,该函数不返回此类值。由于返回类型bool
是 C 标准类型的 typedef,_Bool
任何返回值都将转换为0
或1
。
所以程序是完全错误的。