我无法理解一个问题。问题首先要求编写一个C ++类来表示一个整数堆栈,并且完成了很多工作。这是我的原型:
class Stack{
private:
int top;
int item[100];
public:
Stack() {top = -1;}
~Stack();
void push(int x) {item[++top] = x;}
int pop() {return item[top--];}
int empty(int top);
};
问题的第二部分说“使用堆栈进行存储,编写一个C ++类来表示整数队列”。我的队列如下:
class Queue{
private:
int * data;
int beginning, end, itemCount;
public:
Queue(int maxSize = 100);
Queue(Queue &OtherQueue);
~Queue();
void enqueue(int x);
void dequeue();
int amount();
};
我不明白我是如何将堆栈用于队列的存储目的。
答案 0 :(得分:10)
两个堆叠, 和 out 。
enqueue
一个元素,push
它位于中的 。dequeue
元素,
pop
来自堆栈 out 的元素;否则,pop
和push
out 中的所有元素,然后提供 out 的顶部元素。 重要的是,仅在必要时执行步骤2。请注意,enqueue
的复杂性为 O(1),而dequeue
的复杂性为amortized O(1),前提是您的实施pop
和push
是 O(1)。
答案 1 :(得分:4)
Queue的私有数据必须是Stack。只有这一点,你当然可以琐碎 仅实现LIFO队列;对于FIFO队列,您需要两个堆栈 - 引用 在这个优秀的page提示练习10,“提示:如果你将元素推入堆栈然后将它们全部弹出,它们会以相反的顺序出现。如果你重复这个过程,它们现在又恢复正常了。” ...
答案 2 :(得分:3)
我不同意现有的答案。 通常是,队列是First In First Out,而堆栈显然是Last In First Out。我只能想到一个使用两个堆栈的实现,弹出整个东西并将除最后一个项目之外的所有项目添加到第二个堆栈。
看起来像是一件愚蠢的事情,但我想这是为了练习。如下面所述,可以在amortized O(1)中进行,因为第二个堆栈的顺序正确。您可以从第二个堆栈中获取元素,直到用完为止,在这种情况下,您可以将所有内容从原始堆栈移动到第二个堆栈。
FIFO队列只是Enqueue
为Push
且Dequeue
为Pop
的堆栈。作为一个练习,这没有任何意义,所以我肯定假设有一个FIFO队列。
编辑:添加了一些链接,这些内容在我的手机上不易完成:)
答案 3 :(得分:2)
显然它不是推荐的存储方法,因为一个是LIFO,另一个是FIFO。
要排队,您可以将整数推送到堆栈。
要出列,您必须从堆栈中弹出所有整数,获取最后一个整数,并将所有其他整数推回堆栈。有一个临时堆栈,你可以在弹出它们时推送所有整数,得到你的答案,然后将临时堆栈中的所有整数弹回主存储器。
答案 4 :(得分:2)
堆叠队列?您将需要2个堆栈,当然这将是O(n)队列实现。
答案 5 :(得分:2)
堆栈和队列之间的区别在于堆栈,您可以从顶部添加和删除项目,而在队列中,您可以在顶部添加并从底部删除。因此,要使用堆栈实现队列,排队操作将是堆栈上的正常推送,而出列操作将必须弹出整个堆栈,检索最后一个项目,然后将所有项目推回堆栈。您将不得不使用另一个堆栈临时存储这些项目。
答案 6 :(得分:0)
我怀疑问题的目的是首先定义一个具有存储整数的容量的类Stack。
然后声明一个从堆栈继承的类Queue,它有自己的addtoqueue和servefromqueue函数,但使用与Stack相同的存储机制。
鉴于你的实现,这可能看起来有点奇怪,但是他们可能想要某种堆栈的链表实现(其优点是没有预定义的上限),在这种情况下从堆栈继承的队列使得设计清晰感。
答案 7 :(得分:0)
我怀疑“将 堆栈用于存储目的”意味着使用堆栈而不是堆。也就是说,不要调用malloc,也不要使用全局变量。
编辑:或许不是。我越是想到这一点,我就越怀疑这是一个措辞不好,或者考虑不周的任务。
答案 8 :(得分:0)
如果您真的想使用堆栈实现队列,可以将Stack
成员变量添加到Queue
类。然后这些方法实现如下:
void Queue::enqueue(int value) {
stack.push(value);
}
int Queue::dequeue() {
// TODO: Check for empty queue.
Stack tempStack;
do {
tempStack.push(stack.pop());
} while (!stack.empty());
int value = tempStack.pop();
while (!tempStack.empty()) {
stack.push(tempStack.pop());
}
return value;
}
这是一个非常低效的实施。
答案 9 :(得分:0)
实际上,这是一个给出堆栈输入然后从该堆栈中取出信息的问题,就好像它是一个阙。
我不认为你需要弹出堆栈中的所有整数。您是否可以使用任何其他方法进行堆栈?我的意思是,基于x86,您总是可以根据地址获取堆栈中的元素。
从这个意义上讲,你总是可以通过检索'first-in'数据成员来获取que上的第一个元素,该成员将始终位于堆栈数据结构中数组的第一个索引处(如原型中所示)
所以 - 由于堆栈是LIFO并且que是FIFO,因此使用它对您有利,因为que数据结构依赖于堆栈数据结构。如果可以,请包含一个方法,允许检索堆栈“top”上的第一个元素(这将是元素@index 0)。
首先确保你的教授可以这样做。
答案 10 :(得分:-1)
有不同类型的队列:
如果你的队列是LIFO队列,那么它只是成为一个堆栈的外观,其中enque / deque映射到push / pop。
如果你想要一个FIFO队列,你将需要两个堆栈,并将元素从一个堆栈移到另一个堆栈,以便在它被取代时到达第一个元素,然后你可以从第二个堆栈的顶部转出(这是只要没有其他任何东西被扼杀。如果发生这种情况,你需要将所有东西都转移到第一个堆栈......不是很有效但可能意识到这是练习的重点......
注意:您可能希望至少使堆栈的最大容量在构造时可配置。使其完全动态可能超出了您试图解决的练习范围。
答案 11 :(得分:-2)
队列是实例中的整数堆栈。您可以将整数添加到堆栈中并将其从堆栈中删除。