C++ 使用堆栈的队列

C++ 使用堆栈的队列,c++,stack,queue,C++,Stack,Queue,我很难理解一个问题。这个问题首先要求编写一个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 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();
};

我不明白如何使用堆栈来存储队列。

队列是实例中的整数堆栈。将整数添加到堆栈中,然后将其从堆栈中删除。

队列是实例中的整数堆栈。将整数添加到堆栈中,然后将其从堆栈中删除。

显然,这不是推荐的存储方法,因为一种是后进先出,另一种是先进先出

要排队,可以将整数推到堆栈上


要退出队列,您必须将所有整数从堆栈中弹出,获取最后一个整数,然后将所有其他整数推回到堆栈中。有一个临时堆栈,当您弹出所有整数时,将它们按入堆栈,得到答案,然后将所有整数从临时堆栈中弹出回到主存储器中。

显然,这不是推荐的存储方法,因为一种是后进先出,另一种是先进先出

要排队,可以将整数推到堆栈上


要退出队列,您必须将所有整数从堆栈中弹出,获取最后一个整数,然后将所有其他整数推回到堆栈中。有一个临时堆栈,当您弹出所有整数时,您可以在其中推送它们,获取答案,然后将所有整数从临时堆栈中弹出回到主存储器中。

我想问题的目的是首先定义一个具有存储整数能力的类堆栈

然后声明一个从堆栈继承的类,名为Queue,它有自己的addtoqueue和servefromqueue函数,但使用与堆栈相同的存储机制


考虑到您的实现,这可能看起来有点奇怪,但他们可能打算使用堆栈的某种链表实现(其优点是没有预定义的上限)在这种情况下,从堆栈继承的队列具有明确的设计意义。

我怀疑问题的目的是首先定义一个类堆栈,它具有存储int的能力

然后声明一个从堆栈继承的类,名为Queue,它有自己的addtoqueue和servefromqueue函数,但使用与堆栈相同的存储机制


考虑到您的实现,这似乎有点奇怪,但他们可能打算使用堆栈的某种链表实现(其优点是没有预定义的上限),在这种情况下,从堆栈继承的队列具有明确的设计意义。

使用堆栈排队?您将需要2个堆栈,当然这将是一个O(n)队列实现。

使用堆栈队列?您将需要两个堆栈,当然这将是一个O(n)队列实现。

有不同类型的队列:

如果您的队列是后进先出队列,那么它只会成为一个堆栈的外观,在那里enque/deque映射为push/pop

如果您想要一个FIFO队列,您将需要两个堆栈,并将元素从一个堆栈转移到其他堆栈,以便在第一个元素被占用时到达第一个元素,那么您可以从第二个堆栈的顶部(按相反的顺序)取消占用,只要没有其他元素被占用。如果发生这种情况,您需要将所有内容移回第一个堆栈。。。不是很有效率,但可能意识到这是练习的重点


注意:您可能希望至少在构建时配置堆栈的最大容量。将其完全动态化可能超出了您试图解决的练习范围。

有不同类型的队列:

如果您的队列是后进先出队列,那么它只会成为一个堆栈的外观,在那里enque/deque映射为push/pop

如果您想要一个FIFO队列,您将需要两个堆栈,并将元素从一个堆栈转移到其他堆栈,以便在第一个元素被占用时到达第一个元素,那么您可以从第二个堆栈的顶部(按相反的顺序)取消占用,只要没有其他元素被占用。如果发生这种情况,您需要将所有内容移回第一个堆栈。。。不是很有效率,但可能意识到这是练习的重点


注意:您可能希望至少在构建时配置堆栈的最大容量。将其完全动态化可能超出了您试图解决的练习范围。

队列的私有数据必须是堆栈。当然,只有你能做到这点 仅实施后进先出队列;对于FIFO队列,您需要两个堆栈——引用
练习10的提示“提示:如果您将元素推到堆栈上,然后将它们全部弹出,它们将以相反的顺序显示。如果您重复此过程,它们现在将恢复顺序。”…

队列的私有数据必须是堆栈。当然,只有你能做到这点 仅实施后进先出队列;对于FIFO队列,您需要两个堆栈——引用
练习10的提示在这里非常好,“提示:如果您将元素推到堆栈上,然后将它们全部弹出,它们将以相反的顺序显示。如果您重复此过程,它们现在又恢复了顺序。”…

堆栈和队列的区别在于,您可以从顶部添加和删除项目,而在队列中,您从顶部添加,从底部删除。因此,要使用堆栈实现队列,排队操作将是对堆栈的正常推送,而出列操作必须弹出整个堆栈,检索最后一个项目,然后将所有项目推回到堆栈上。您必须使用另一个堆栈来临时存储项目。

堆栈和队列的区别在于,在堆栈中,您可以从顶部添加和删除项目,而在队列中,您可以从顶部添加和从底部删除项目。这么说吧
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;
}