如何创建返回新堆栈的函数
How to create a function that returns a new stack?
我正在做功课,我自己创建了一个堆栈,并且想要一个函数,从仅包含(例如(正数的先前堆栈创建一个新堆栈。
我已经做了一个 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)
{
}
相关文章:
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 提升堆栈跟踪不显示函数名称和行号
- C++析构函数调用两次,堆栈分配的复合对象
- 静态堆栈函数不会 1) 输入第一个元素 2)添加新元素时识别旧元素
- 以下代码如何工作以每次为唯一调用堆栈唯一实例化模板函数?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 如果类在堆上,函数是转到堆还是堆栈?
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 何时在函数中声明堆栈分配变量?
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 双链表堆栈删除函数不起作用
- 函数,该函数将在堆栈底部保留最小的出现次数
- 我正在尝试使用递归来反转堆栈.函数 fun() 中传递了什么?s 是类堆栈的对象
- Visual C++ 堆栈函数和错误处理
- 如何知道堆栈函数消耗了多少
- 如何在这个无锁堆栈函数中防止未定义的行为和ABA问题
- 打印堆栈函数
- 堆栈函数应该返回指定的元素,而不是返回垃圾值