2014-10-09 59 views
-2

如何从堆栈中删除最旧的元素而不是抛出fullStackException? 是不是有关于它的算法?如何从堆栈中删除最老的元素?

+1

什么语言/框架? – Geoffroy 2014-10-09 06:34:28

+1

对不起,它是C/C++ – user4124063 2014-10-09 06:36:28

+6

对于'std :: stack'没有'fullStackException',底层容器('std :: deque')是动态的。 – Geoffroy 2014-10-09 06:39:35

回答

0

难道你不在队列中混淆自己吗?允许移除最旧元素的堆栈可称为出列。在任何情况下有多个维度对这个问题

我不会说移除最旧的元素是可能的(单个)栈。但是你总是可以偷看最古老的元素。通过保持一个变量。在插入第一个元素时定义该变量。当你不得不偷看时。只需使用该变量即可。

如果你真的想删除最旧的元素,并且只允许使用堆栈。那么可能你可以使用两个堆栈来做到这一点

stack1包含所有的元素。 Stack2是空的。

while(!stack1.empty()){ 
    stack2.push(stack1.pop()); 
} 
stack2.pop(); 
while(!stack2.empty()){ 
    stack1.push(); //Or Instead of 2nd while you can also swap the stack1 and stack2(like swapping two variables) 
} 

上面的代码实际上是更普遍使用2个叠执行队列名称已知的。你可能想看看在它

2

一个典型的堆栈是一个数据结构,它允许推送新条目并查看和弹出最新推送的条目(顶部)。

如果您有可以访问的底部入口的实现,那么严格来说,它不是一个堆栈。

但是,如果你自己做它,它有可能使其中最早的条目可以删除一个LIFO数据结构。只要确保使用一个双链表并保留一个指向底部条目的指针。请注意,这是接近std::deque

1

如果可以访问或删除最古老的元素,它不是 堆栈。不过,如果你想要一个最大尺寸的堆栈,其中 删除最长的元素,当它变得太大的时候腾出空间, 你可以从std::stack得到。标准 使得下划线容器成为受保护的数据成员,因此 派生类可以通过访问它。