如何从堆栈中删除基本元素并以相同的顺序返回它,而不使用push,pop,any方法

时间:2016-11-10 23:23:24

标签: c++ algorithm stack

我正在使用堆栈在C ++中编写一个名为popButtom()的方法。

该方法必须执行以下操作:¨消除基础元素并使堆栈保持相同的顺序但没有元素elminado,我不能使用pop或push。

例如:

ini stack:

一个

ç
d

结束筹码:

一个

C

我编写了以下内容,但我不知道我可以做坏事:

void popFull()
{
    struct node *A, *B;

    top1 = top;

    while (top1 != NULL)
    {
        B = top1->ptr;        
        A = top1;                     

        B->ptr = A;

        top1 = B;
    }
}

此致 玛丽亚姆

1 个答案:

答案 0 :(得分:0)

所以,我会看到我能做些什么来回答这个问题,尽管如果你能包含一个更完整的代码版本会非常有用,因为我不完全确定你的某些类型的数据结构是什么变量是因为没有包含声明。同样,你能否澄清你的意思“但我不知道我可以做坏事:”?我认为这些变化会让您的问题更容易回答。

在任何情况下,我都会尝试通过将其解释为“如何消除基础元素并使堆栈保持相同的顺序,而不是使用pop或push”来回答您的问题。 (我认为这是某种分配?)

为此,我会提出几个选择。 C ++ 11有另一个不是push()pop()的函数,您可以通过执行stack.emplace()来使用它只是将一个项添加到堆栈的顶部。它在功能上与stack.push相同,但它可能是一个不错的黑客。这显然有点技术性,实际上有一点不同(尽管如此,如果你感兴趣的话,这里有一个链接:C++: Stack's push() vs emplace())但是你可能能够摆脱它。

接下来,我会说如果你不能使用stack.pop()stack.push()这个下一个选项是可能的,但只有你用容器类的vector初始化堆栈时,因为否则项目是在记忆中不连续,并且不能保证它会起作用。我指的当然是指针算术。这里:Copy std::stack into an std::vector是另一个解决这个问题的答案,但我会简要介绍一下他们做了什么。如果使用文档中的this示例中的std::vector初始化堆栈,则可以将堆栈复制到向量,然后在该向量上自由操作,然后复制回堆栈。 / p>

这就是我的意思(请记住,只有当容器类为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);

欢呼,从这里顺利航行,现在您可以使用您在矢量上选择的方法自由移除物品。然后,当您修改了向量时,您可以通过执行相反的操作来创建另一个堆栈:

std::stack<int, std::vector<int>> newStack (stackContents);
return newStack;

显然这是一个主要的解决方法,在现实世界中,pop()和push()是有用的功能,并且包含在原因中。这实际上可能是触及堆栈设计为从任一端访问的想法的好时机。这就是为什么它被归类为后进先出,因为顺序的想法很重要并且试图规避该顺序意​​味着堆栈不是首先使用的正确数据结构。无论哪种方式,这是我的两分钱,我希望这会有所帮助。