在C+中,是否可以检查存储在堆栈上的字是否是没有任何附加数据结构的palyndrome+; 在C++程序中,我们分析栈数据结构。 我的问题是:在没有任何附加数据结构和修改堆栈的情况下,是否可以检查给定堆栈是否包含回文?只要重新组合堆栈(我的意思是通过修改),就可以分解堆栈
例1:s={1,2,3,2,1}-它是回文的 例2:s={1,2,3,4,5}-它不是回文在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语言中的任何附加数据结构++ 我想你所说的数据结构是指其他一些抽象数据结构或容器,比如列表、向量等等 您可以通过将
- 我唯一的想法是使用递归:
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;
}