我正在使用堆栈在 C++ 中编写一个名为 popButtom () 的方法。
该方法必须执行以下操作:“消除 base 的元素并以相同的顺序离开堆栈但没有元素 elminado”,我不能使用 pop 或 push。
例如:
ini 堆栈:
一个
乙
C
结束堆栈:
一个
乙
C
我编写了以下程序,但我不知道我会不会有问题:
void popFull()
{
struct node *A, *B;
top1 = top;
while (top1 != NULL)
{
B = top1->ptr;
A = top1;
B->ptr = A;
top1 = B;
}
}
问候 玛丽雅姆
最佳答案
所以,我会看看我能做些什么来回答这个问题,不过如果你能包含一个更完整的代码版本会很有帮助,因为我不完全确定你的一些数据结构是什么类型的变量是因为没有包含声明。另外,您能否阐明“但我不知道我可能有坏处:”是什么意思?我认为这些更改会使您的问题更容易回答。
无论如何,我会尝试通过将其解释为“我如何消除底部的元素并以相同的顺序保留堆栈,而不是使用 pop 或 push”来回答您的问题。 (我假设这是某种作业?)
为此,我将提出几个选项。 C++11 有另一个不是 push()
或 pop()
的函数,您可以通过 stack.emplace()
使用它它只是将一个项目添加到堆栈的顶部。它在功能上与 stack.push
相同,但它可能是一个不错的 hack。这显然有点技术性,实际上是有区别的(虽然非常细微,如果您有兴趣,这里有一个链接:C++: Stack's push() vs emplace())但您也许可以摆脱它。
接下来,我会说,如果您不能使用 stack.pop()
或 stack.push()
下一个选项是可行的,但前提是您使用 vector 容器类初始化堆栈,否则项目在内存中不连续并且无法保证它会工作。当然,我指的是指针运算。这里:Copy std::stack into an std::vector是处理此问题的另一个答案,但我将简要概述他们所做的事情。如果您使用 std::vector
初始化堆栈,如 this文档中的示例,然后您可以将堆栈复制到一个 vector ,然后在该 vector 上自由操作,然后复制回堆栈。
这就是我的意思(请记住,这仅在容器类是 vector
时才有效,因为看起来您只是在设计一个函数来接收参数而不是初始化您自己的参数)。
//this is how it will have to have been initailized
//for this to be guarenteed to work
std::stack<int, std::vector<int>> myStack;
int* begin = &stack.top()+1;
int* end = being+stack.size();
std::vector stackContents(begin,end);
万岁,从这里一帆风顺,现在您可以使用您在 vector 上选择的方法自由移除项目。然后,当您修改了 vector 后,您可以通过执行相反的操作来创建另一个堆栈以返回:
std::stack<int, std::vector<int>> newStack (stackContents);
return newStack;
显然,这是一个主要的解决方法,在现实世界中,pop() 和 push() 是有用的函数,被包含在内是有原因的。这实际上可能是讨论堆栈被设计为从任一端访问的想法的好时机。这就是为什么它被归类为后进先出的原因,因为顺序的想法很重要,而试图规避该顺序意味着堆栈不是首先要使用的正确数据结构。无论哪种方式,这是我的两分钱,我希望这会有所帮助。
关于c++ - 如何在不使用 push, pop, any 方法的情况下从堆栈中移除基本元素并以相同的顺序返回它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40538747/