我正在做作业,我自己创建了一个堆栈,并且想要一个函数来从上一个仅包含(例如)正数的堆栈中创建一个新堆栈。
我已经完成了一个void函数,该函数可以修改原始堆栈,并且不能使其保持不变。 代码的组织方式:
cell.h,它包含在私有节元素中,并包含指向下一个单元格,构造函数-析构函数和getters-setter的指针。
stack.h,其中包含虚拟纯方法(createStack()-emptyStack()-top()..)
stackp.h的stack.h派生类重新定义了stack.h中的每个方法,并包含printPositiveStack()。
template <class T>
void stackp<T>::printPositiveStack(){
stackp<T> auxp;
while(!this->emptyStack()){
int temp = this->top();
if(temp <= 0){
this->pop();
} else {
auxp.push(temp);
this->pop();
}
}
while(!auxp.emptyStack()){
this->push(auxp.top());
auxp.pop();
}
}
如何创建不返回原始堆栈而又返回新堆栈的函数?谢谢!
答案 0 :(得分:1)
如果只想使用堆栈的公共接口来复制堆栈,则只有一种方法可以将堆栈拆开(从上到下),保存所有看到的元素,然后重新堆叠到新堆栈上堆栈和原始的。像这样:
std::vector<T> elements;
while(!originalStack.empty()) {
elements.push_front(originalStack.pop());
}
for(T& element : elements) {
// Note: be careful about using references here, depending on whether the stack
// makes a copy of the elements (like vector does).
originalStack.push(element);
newStack.push(element);
}
如果您的函数是堆栈类的成员,例如一个复制构造函数,您也许可以(也许应该)通过使用内部函数来做一些更有效的事情。它的外观取决于您如何实现它,而您没有显示该代码。但是,作为一个示例,假设您的堆栈内部使用一个向量将元素存储在堆栈上,则复制构造函数可能看起来像这样简单:
StackP<T>(const StackP<T>& other)
: elements(other.elements)
{
}
答案 1 :(得分:1)
似乎您无法遍历原始数据,只能看到/弹出最后插入的元素。鉴于此假设,我认为您唯一的机会就是算法的性能极差: