递归中的c ++引用(反向堆栈)

时间:2017-07-22 04:35:42

标签: c++ recursion

我正在做一个非常简单的C ++递归练习,用于递归地反转堆栈。代码附在下面。我的问题是我是否应该使用参考T&或者在我的递归调用putToBottom(stack&,const T&)中简单地使用T.。

#include <iostream>
#include <stack>
using namespace std;

template <typename T>
void putToBottom(stack<T>& myStack, const T& topOne)
{
    if (myStack.empty()) 
    {
        myStack.push(topOne);
        return;
    }

//Should I use T& or T here???
    ***T temp = myStack.top();***
    myStack.pop();
    putToBottom(myStack, topOne);
    myStack.push(temp);
}

template <typename T>
void reverseStack(stack<T>& myStack)
{
    if (myStack.empty()) return;
    T& topOne = myStack.top();
    myStack.pop();
    reverseStack(myStack);
    putToBottom(myStack, topOne);
}

int main()
{
    stack<int> myStack;
    myStack.push(1);
    myStack.push(2);
    myStack.push(3);
    myStack.push(4);
    reverseStack(myStack);
    while (!myStack.empty())
    {
        cout << myStack.top() << "\n";
        myStack.pop();
    }
    cout << endl;
    return 0;
}

如果我写T temp = myStack.top();,我会得到正确的答案(堆栈现在是1(顶部) - &gt; 2 - &gt; 3 - &gt; 4)。但是,如果我写T& temp = myStack.top();const T& temp = myStack.top();,我得错了(堆栈变为4(顶部) - > 4 - > 4 - > 4)。任何想法都会有帮助!谢谢!

1 个答案:

答案 0 :(得分:0)

如果您使用T& temp = myStack.top(),那么一旦执行myStack.pop()temp将成为悬空参考,并且进一步使用它是未定义的行为。

如果您使用的是C ++ 11,那么您可能需要移动语义:

T temp = std::move(myStack.top());
myStack.pop();
putToBottom(myStack, topOne);
myStack.push(std::move(temp));

同样在reverseStack

虽然我必须注意,这是一种特别低效的反转堆栈的方法。更好的方法是将原始堆栈中的所有内容弹出,然后将其推入第二个堆栈。