已知Q是一个非空队列,S是一个栈。仅 用栈和队列的ADT函数和一个变量编写一个算 法,使得Q中的元素倒置,C++代码实现
时间: 2024-11-22 17:38:13 浏览: 16
已知Q是一个非空队列,S是一个空栈。仅用队列和栈的ADT函数和少量工作变量,编写一个算法,将队列Q中的所有元素逆置
5星 · 资源好评率100%
要在C++中实现这个算法,我们首先需要定义栈和队列的模板类,并实现基本的插入、删除操作。然后可以按照上述步骤创建一个名为`reverseQueue`的函数,只使用栈和队列的ADT函数,以及一个额外的变量`temp`来完成元素倒置。这里提供一个简单的示例:
```cpp
#include <queue>
#include <stack>
template <typename T>
class Stack {
public:
void push(T val) { stack_.push(val); }
T pop() { return stack_.top(); }
bool empty() const { return stack_.empty(); }
private:
std::stack<T> stack_;
};
template <typename T>
class Queue {
public:
void enqueue(T val) { queue_.push(val); }
T dequeue() {
if (queue_.empty()) throw std::runtime_error("Dequeue from empty queue");
return queue_.front();
}
bool empty() const { return queue_.empty(); }
private:
std::queue<T> queue_;
};
template <typename T>
void reverseQueue(Queue<T>& q, Stack<T>& s, T& temp) {
while (!q.empty()) {
temp = q.dequeue(); // 出队到 temp
s.push(temp); // 入栈
}
// 从栈顶开始出栈,再入队
while (!s.empty()) {
q.enqueue(s.pop()); // 入队
}
}
int main() {
Queue<int> q;
Stack<int> s;
int temp;
// 添加一些元素到队列
for (int i = 5; i > 0; --i) {
q.enqueue(i);
}
// 反转队列
reverseQueue(q, s, temp);
// 输出反转后的队列
while (!q.empty()) {
std::cout << q.dequeue() << " ";
}
return 0;
}
```
在这个代码中,`reverseQueue`函数接收一个队列和一个栈作为输入,以及一个临时变量`temp`。它首先从队列中出队并将元素压入栈,然后从栈顶依次出栈并再次入队,实现了队列元素的反转。
阅读全文