2013-10-14 42 views
2

这里是我的功能,我的pop功能需要什么参数?

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; 
    } 

我的问题是: 我不知道如何做到这一点的主要被调用。据我的理解,一个弹出功能应该没有选择弹出堆栈的选项。 LIFO对吗?主要问题是Keytype & x参数的确切含义以及如何在main中调用它? (在这种情况下,KeyType被初始化为KeyType *在这个特定的程序中堆栈一个int)。

+1

实际上,Stack的Pop方法不应该接受任何参数,因为它总是返回堆栈中最顶层的元素,因为它是一个后进先出的数据结构。 我认为你的Pop方法会返回一个指向Stack顶端元素的指针以及值本身;第一个作为返回值,后者通过引用传递。 – Rami

+0

它实际上不是一个堆栈,它是一个使用类的堆栈的实现,可能应该放在那里的某个地方,但是这是在一个教师给我们的头文件中,所以我假设它是可行的。我一直在辩论是否只是删除一段时间的参数大声笑。 – Phenom

回答

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 
    } 
} 
+0

谢谢你的解释先生,是的,我不会像这样设置它,它只是一个基本堆栈模板的一部分,我们的教师让我们用于做家庭作业,我们必须做其他功能,而我我的头不能包住它。 – Phenom

0

它填补弹出的项目

int main(..) 
{ 

    ... 
    int poppedItem; 

    stack.pop(poppedItem); 
} 
0

的价值。如果KeyType参数是int如你所说,那么你的Stack可能会是这样的:

Stack<int> stack; 

的符号在Pop方法表示您通过参考KeyType(即您的int) r案例)。也就是说,Pop方法不仅返回弹出项的值,而且还将值放入传递的参数中。

int a, b; 
a = *(stack.pop(b)); 
cout << a << " = " << b << endl; 
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 
0

据我了解的功能需要的任何元素keytype并检索参考。

因此调用

int value = 0; 
Pop(value); 

正在呼叫流行与&值 - 所以实际上与int值的地址,并因此通过引用。

我想知道return 0的情况下,如果您使用编译器可能会告诉您的任何非数值数据类型调用Pop,返回语句无效。也许返回NULL会更好。 (至少更好读)

相关问题