1、题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”,“deleteHead”]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]
2、VS2019上运行
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
class CQueue {
private:
stack<int> inStack, outStack;
void in2out() {
// 将输入栈中的元素转移到输出栈中
while (!inStack.empty()) {
outStack.push(inStack.top());
inStack.pop();
}
}
public:
CQueue() {}
void appendTail(int value) {
// 将元素添加到输入栈中
inStack.push(value);
}
int deleteHead() {
// 检查输出栈是否为空,为空则将输入栈中的元素转移到输出栈中
if (outStack.empty()) {
if (inStack.empty()) {
// 输入栈和输出栈都为空,说明队列中没有元素
return -1;
}
in2out();
}
// 输出栈的栈顶元素即为队列的头部元素,弹出并返回
int value = outStack.top();
outStack.pop();
return value;
}
};
int main() {
// 操作序列
vector<string> operations = { "CQueue", "appendTail", "deleteHead", "deleteHead", "deleteHead" };
// 操作对应的参数
vector<vector<int>> values = { {}, {3}, {}, {}, {} };
// 创建 CQueue 对象
CQueue q;
// 遍历操作序列
for (int i = 0; i < operations.size(); i++) {
if (operations[i] == "CQueue") {
// 创建新的 CQueue 对象
q = CQueue();
cout << "null" << endl; // 输出 null 表示操作无返回值
}
else if (operations[i] == "appendTail") {
// 调用 appendTail 操作将参数值添加到队列尾部
q.appendTail(values[i][0]);
cout << "null" << endl; // 输出 null 表示操作无返回值
}
else if (operations[i] == "deleteHead") {
// 调用 deleteHead 操作删除队列头部元素,并输出返回值
int result = q.deleteHead();
if (result == -1) {
cout << -1 << endl;
}
else {
cout << result << endl;
}
}
}
return 0;
}
运行结果:
null
null
3
-1
-1
3、C++中栈和队列
1、 队列(Queue)常见函数和操作:
#include <queue>
std::queue<int> q; // 声明一个队列
q.push(item); // 添加元素到队列的尾部
q.pop(); // 删除队列的头部元素
bool isEmpty = q.empty(); // 检查队列是否为空
int frontItem = q.front(); // 返回队列的头部元素
2、栈(Stack)常见函数和操作
#include <stack>
std::stack<int> s; // 声明一个栈
s.push(item); // 添加元素到栈的顶部
s.pop(); // 删除栈顶部的元素
bool isEmpty = s.empty(); // 检查栈是否为空
int topItem = s.top(); // 返回栈顶部的元素
4、解题思路
题目要求使用两个栈来实现一个队列。队列是一种先进先出(First-in-First-out,FIFO)的数据结构,而栈是一种后进先出(Last-in-First-out,LIFO)的数据结构。
在这个题目中,我们需要实现两个方法:
- appendTail(value):向队列尾部添加一个元素。
- deleteHead():删除队列头部的元素并返回该元素的值。
根据题目要求,我们需要使用两个栈来模拟队列的操作。具体实现如下:
- 我们使用栈1(stack1)来模拟队列的尾部,元素从栈顶进入该栈。
- 我们使用栈2(stack2)来模拟队列的头部,元素从栈顶出栈。
- 当要添加元素时,我们直接将元素压入栈1中。
- 当要删除元素时,如果栈2中有元素,我们直接从栈2栈顶弹出并返回元素。
- .如果栈2中没有元素,我们将栈1中的元素依次弹出并压入栈2中,然后再从栈2的栈顶弹出并返回元素。
通过这样的实现,我们可以保证在栈2中的元素是先进入队列的,实现了先进先出的特性。