这是我的功能,
template <class KeyType >
KeyType * Stack<KeyType>::Pop(KeyType& x) {
if (IsEmpty()) { //isempty is just a bool function
StackEmpty(); //just prints out that stack is empty
return 0; //bad coding breaking out of the function
}
x = stack[top--]; //stack is a pointer to an array, top is the top of the stack
return &x;
}
我的问题是: 我不确定如何在main中调用它。根据我的理解,pop函数不应该真正选择从堆栈弹出的内容。 LIFO对吗?主要问题是Keytype&amp; x参数采取以及如何在main中调用它? (在这种情况下,KeyType初始化为KeyType *在此特定程序中堆栈一个int)。
答案 0 :(得分:5)
这是非常奇怪的设计的功能。
Stack
是一个类模板,由存储在堆栈中的类型(由于某种原因命名为KeyType
)参数化。该函数采用类型引用的输出参数 x
KeyType
,如果堆栈不为空,则将弹出的值赋给x
。同时,它返回其地址(它返回指向KeyType
的指针)。如果在调用pop()
时堆栈为空,它将调用StackEmpty()
然后返回空指针。
用法:
int main() {
Stack<int> stack;
//fill stack somehow
int val;
stack.pop(val); //val will be set to the popped item, or unchanged if the stack was empty
// You can also use the return value to access the popped item:
std::cout << *stack.pop(val);
// ... or use it to test whether the pop() succeeeded
if (stack.pop(val)) {
//val was popped, use it
}
}
答案 1 :(得分:0)
它填充弹出项目的值
int main(..)
{
...
int poppedItem;
stack.pop(poppedItem);
}
答案 2 :(得分:0)
如果KeyType
参数是您所说的int
,则您的Stack
可能如下所示:
Stack<int> stack;
Pop
方法中的&符号表示您传入KeyType
的引用(在您的情况下为int
)。也就是说,Pop
方法不仅返回弹出项的值,还将值放在传递的参数中。
int a, b;
a = *(stack.pop(b));
cout << a << " = " << b << endl;
答案 3 :(得分:0)
变量x与返回值相同(只是获取从堆栈中排除的顶部元素的其他方式)
Stack<int> my_stack;
// blah-blah-blah ...
int tmp;
int* tmp_pointer = my_stack.pop(tmp);
some_func(tmp);
some_other_func(*tmp_pointer);
// tmp_pointer == &tmp;
// you can use one of two ways
答案 4 :(得分:0)
据我所知,该函数接受keytype的任何元素并检索引用。
所以打电话
int value = 0;
Pop(value);
使用&amp; value调用Pop - 所以实际上是使用int值的地址,因此通过引用。
我想知道return 0
如果您使用编译器可能告诉您的任何非数值数据类型调用Pop,则返回语句无效。也许返回NULL会更好。 (至少更好阅读)