递归打印单个链接列表堆栈时遇到问题

时间:2020-05-16 11:45:28

标签: c++ recursion linked-list stack function-definition

我目前很难弄清楚该怎么做。我现在的想法是每次在内部递归调用pop()时都拥有堆栈this print,但这对我不起作用。

template <class T>
void Stack<T>::print() const {  
    if (top->next == nullptr) {
        cout << "End of list" << endl;
    }
    else {
        cout << top->data;
        this->pop();
        print();
    }
}

当我通过Stack<int> test在main中声明一个int类型的Stack时,出现错误"passing const Stack<int> as 'this' argument discards qualifiers

2 个答案:

答案 0 :(得分:1)

passing const Stack<int> as 'this' argument discards qualifiers

这是您的问题。您用print来限定const函数。这是保证您在打印时不会更改堆栈(这是合理的期望)。调用pop会改变堆栈,从而破坏了承诺。

编译器错误消息中的“限定符”为const,因此“放弃限定符”基本上意味着“放弃了不更改*this的承诺”。

答案 1 :(得分:0)

对于初学者来说,该功能不是递归功能(如您在更新问题之前所显示的那样)。

此外,当为空堆栈调用时(即,指针top等于nullptr时,它具有未定义的行为。

对于错误消息,然后函数pop会从常量函数print调用时更改堆栈(它是非常量成员函数)。因此,编译器会发出错误消息。

因此,假设函数print将在输出其值的过程中更改堆栈,然后应将其声明为非恒定函数。

该函数的外观如下所示。我假设函数push或其类似物声明为

void push( const T & );

您在这里。

template <class T>
std::ostream & Stack<T>::print( std::ostream &os = std::cout ) 
{
    if ( this->top )
    {
        os << top->data << ' ';

        auto value = top->data;

        this->pop();

        this->print( os );

        this->push( value );      
    }

    return os;
}

该函数可以像

那样调用
Stack<int> test;

//...

test.print() << '\n';

这里是一个演示程序,该示例程序显示了上面的函数,并且对标准类模板std :: stack进行了较小的更改(因为未显示堆栈定义)。

#include <iostream>
#include <stack>

template <class T>
std::ostream & print( std::stack<T> &st, std::ostream &os = std::cout ) 
{
    if ( not st.empty() )
    {
        os << st.top() << ' ';

        auto value = st.top();

        st.pop();

        print( st, os );

        st.push( value );      
    }

    return os;
}

int main() 
{
    std::stack<int> st( std::stack<int>::container_type { 5, 4, 3, 2, 1 } );

    print( st ) << '\n';

    return 0;
}

程序输出为

1 2 3 4 5