Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中,是否可以检查存储在堆栈上的字是否是没有任何附加数据结构的palyndrome+; 在C++程序中,我们分析栈数据结构。 我的问题是:在没有任何附加数据结构和修改堆栈的情况下,是否可以检查给定堆栈是否包含回文?只要重新组合堆栈(我的意思是通过修改),就可以分解堆栈_C++_Algorithm_Stack_Palindrome - Fatal编程技术网

在C+中,是否可以检查存储在堆栈上的字是否是没有任何附加数据结构的palyndrome+; 在C++程序中,我们分析栈数据结构。 我的问题是:在没有任何附加数据结构和修改堆栈的情况下,是否可以检查给定堆栈是否包含回文?只要重新组合堆栈(我的意思是通过修改),就可以分解堆栈

在C+中,是否可以检查存储在堆栈上的字是否是没有任何附加数据结构的palyndrome+; 在C++程序中,我们分析栈数据结构。 我的问题是:在没有任何附加数据结构和修改堆栈的情况下,是否可以检查给定堆栈是否包含回文?只要重新组合堆栈(我的意思是通过修改),就可以分解堆栈,c++,algorithm,stack,palindrome,C++,Algorithm,Stack,Palindrome,例1:s={1,2,3,2,1}-它是回文的 例2:s={1,2,3,4,5}-它不是回文 我唯一的想法是使用递归: void检查堆栈(堆栈&s){ //退出条件 如果(s.numberOfElements()==0){ 返回; } int temp=s.pop(); 检查堆栈; s、 推动(温度); } 是否可以检查存储在堆栈上的字是否是没有标记的palyndrome C语言中的任何附加数据结构++ 我想你所说的数据结构是指其他一些抽象数据结构或容器,比如列表、向量等等 您可以通过将

例1:s={1,2,3,2,1}-它是回文的 例2:s={1,2,3,4,5}-它不是回文

  • 我唯一的想法是使用递归:

void检查堆栈(堆栈&s){
//退出条件
如果(s.numberOfElements()==0){
返回;
} 
int temp=s.pop();
检查堆栈;
s、 推动(温度);
}
是否可以检查存储在堆栈上的字是否是没有标记的palyndrome C语言中的任何附加数据结构++

我想你所说的数据结构是指其他一些抽象数据结构或容器,比如列表、向量等等

您可以通过将标准类
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;
}

wrapper
可以访问类
std::stack
的受保护数据成员
c
,该成员表示底层容器。

老实说,我很确定您引用的任务描述并不完全正确。这项任务有几点可疑

首先,你可能会做一些吹毛求疵的事情,认为不使用任何其他数据结构就不可能使用
std::stack
。std::stack只是构建在某个底层容器上的容器适配器。默认值为
std::deque
。严格地说,使用
std::stack
而不使用任何其他数据结构是没有意义的

接下来,不允许修改堆栈,但允许对其进行分解,只要将其重新组合在一起。这基本上允许你做任何事情。我的意思是,例如,您可以编写一个返回第n个元素的函数,例如:

int access(std::stack<int> s, size_t i) {
    while (i--) s.pop();
    return s.top();
}

这也可以转化为递归方法(老实说,我没有得到关于递归的宣传),但是如果没有第二个堆栈,我不知道如何实现。此外,我也没有费心重建原始堆栈,但这样做很容易。

相当多的欺骗,尽管没有;,我不知道如何解决它。)评论不用于扩展讨论;这段对话已经结束。
true
false
int access(std::stack<int> s, size_t i) {
    while (i--) s.pop();
    return s.top();
}
bool check_palindrome(std::stack<int>& s) {
    std::stack<int> t;
    while (t.size() < s.size()) {
        auto temp = s.top();
        s.pop();
        t.push(temp);
    }
    if (t.size() > s.size()) t.pop();
    return s==t;
}