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

How to create a function that returns a new stack?

本文关键字:堆栈 函数 新堆栈 返回 创建 何创建      更新时间:2023-10-16

我正在做功课,我自己创建了一个堆栈,并且想要一个函数,从仅包含(例如(正数的先前堆栈创建一个新堆栈。

我已经做了一个 void 函数来修改原始堆栈,但我无法保持它不被修改。代码的组织方式如下:

  • cell.h 包含在私有部分元素和指向下一个单元格、构造函数-析构函数和 getter-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();
    }
      }
    

如何创建一个在不更改原始堆栈的情况下返回新堆栈的函数?谢谢!

似乎您无法迭代原始数据,只能查看/弹出最后一个插入的元素。鉴于这个假设,我认为你唯一的机会是一个性能非常糟糕的算法:

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

如果您只想使用其公共接口复制堆栈,只有一种方法可以做到这一点,那就是取消堆栈(从上到下(,保存您看到的所有元素,然后重新堆叠到新堆栈和原始堆栈上。像这样:

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)
{
}