如何创建一个返回新堆栈的函数?

时间:2019-06-11 08:42:03

标签: c++

我正在做作业,我自己创建了一个堆栈,并且想要一个函数来从上一个仅包含(例如)正数的堆栈中创建一个新堆栈。

我已经完成了一个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();
    }
      }
    

如何创建不返回原始堆栈而又返回新堆栈的函数?谢谢!

2 个答案:

答案 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)

似乎您无法遍历原始数据,只能看到/弹出最后插入的元素。鉴于此假设,我认为您唯一的机会就是算法的性能极差:

  • 鉴于您拥有堆栈A
  • 通过top()'ing和pop()'创建要复制并在其中插入元素的当前堆栈来创建堆栈B(这将与您当前的堆栈A相反)
  • 现在再次执行相同的操作,从堆栈B的top()和pop()',但是现在您复制元素。
    • 一个用于当前堆栈A的堆栈,因此它将与以前相同
    • 然后将其放入副本堆栈C,然后返回