我的pop函数应该采用什么参数?

时间:2013-10-14 07:09:25

标签: c++ templates stack

这是我的功能,

    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)。

5 个答案:

答案 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会更好。 (至少更好阅读)