Отправлено: 21.08.19 21:26. Заголовок: Как проверить, является объект класса std::stack палиндромом или нет, не изменяя сам объект?
Недавно встретил такой вопрос: как проверить, является ли содержимое объекта класса
std::stack палиндромом или нет, не изменяя при этом сам объект.
То есть делать такие операции со стеком, как
pop или
push, не разрешается.
Выполнить эту задачу можно, создав "обертку" для класса
std::stack.
Ниже представлена соответствующая демонстрационная программа.
#include <iostream>
#include <iomanip>
#include <stack>
#include <iterator>
#include <algorithm>
bool is_palindrome( const std::stack<int> &st )
{
struct wrapper : std::stack<int>
{
wrapper( const std::stack<int> &st ) : std::stack<int>( st ) {}
bool is_palindrome() const
{
return std::equal( std::begin( c ), std::next( std::begin( c ), c.size() / 2 ),
std::rbegin( c ) );
}
} w( st );
return w.is_palindrome();
}
int main()
{
std::stack<int> st1( std::stack<int>::container_type{ 1, 2, 3, 2, 1 } );
std::cout << std::boolalpha << is_palindrome( st1 ) << '\n';
std::stack<int> st2( std::stack<int>::container_type{ 1, 2, 3, 4, 5 } );
std::cout << std::boolalpha << is_palindrome( st2 ) << '\n';
return 0;
}
Вывод программы на консоль
true
false