问题一: 使用两个栈实现一个队列
思路: 假设我们使用的两个栈为S1和S2,其中S1主要是用来push数据的,当需要查看数据的时候,将S1中的数据取出放到S2中然后S2中的栈顶即使我们模拟的队列的队头元素。
代码
#include <iostream>
#include <stack>
using namespace std;
class MyQueue {
public:
/** Initialize your data structure here. */
MyQueue() {
}
void push(int x) {
s1.push(x);
}
// 取出队头元素
int pop() {
if (s2.empty()) {
s2.push(s1.top());
s1.pop();
}
int val = s2.top();
s2.pop();
return val;
}
// 查看队头元素
int peek() {
if (s2.empty()) {
s2.push(s1.top());
s1.pop();
}
int val = s2.top();
return val;
}
int empty() {
return s1.empty() && s2.empty();
}
private:
stack<int> s1;
stack<int> s2;
};
int main() {
return 0;
}
问题二: 使用两个队列实现一个栈
思路: 假设我们有两个队列,q1存放新入栈的元素,q2存储已经调整好的栈的数据。当往q1中push新的数据后将q2中的数据出队push到q1中。(我们也可以这样判断:将新元素push到空的队列中,然后把另一个队列的数据出队push到这个队列的后面)
代码
#include <queue>
using namespace std;
class MyStack {
public:
MyStack() {
q1 = new queue<int>;
q2 = new queue<int>;
}
~MyStack() {
delete q1;
delete q2;
q1 = nullptr;
q2 = nullptr;
}
void push(int x) {
q1->push(x);
while (!q2->empty())
{
q1->push(q2->front());
q2->pop();
}
// 让q1指向空的,q2指向有数据的队列
queue<int>* p = q1;
q2 = q1;
q1 = p;
}
int pop() {
int val = q2->front();
q2->pop();
return val;
}
int top() {
int val = q2->front();
return val;
}
bool empty() {
return q2->empty();
}
private:
queue<int>* q1; // 我们使用q1永远指向空的队列
queue<int>* q2; // 我们使用q2永远指向不为空的队列
};
int main() {
return 0;
}