1.核心思想是用两个栈模拟一个队列的实现,一个栈用来入队,另一个栈用来出队。(注意每次操作出队栈时先判空,空则把入队栈的元素全部转移到出队栈中)
2.还有一点需要注意的是,出队操作是要返回出队元素值的,所以需要先用一个变量保存出队栈顶元素值,再进行出栈操作,最后返回队头元素值。如果直接return stOut.top(),会导致出队操作pop完成不了。
class MyQueue {
public:
stack<int> stIn;//一个栈存数据
stack<int> stOut;//一个栈出数据
MyQueue() {
}
void push(int x) {
stIn.push(x);//直接入存数据的栈
}
int pop() {
if(stOut.empty()){//出栈先判断出数据的栈是否为空
while(!stIn.empty()){//空就把入数据的栈的全部数据都转移到出数据的栈
int x=stIn.top();
stOut.push(x);
stIn.pop();
}
}
int result=stOut.top();//先获取再弹出
stOut.pop();
return result;
}
int peek() {
if(stOut.empty()){
while(!stIn.empty()){
int x=stIn.top();
stOut.push(x);
stIn.pop();
}
}
return stOut.top();
}
bool empty() {
if(stIn.empty()&&stOut.empty())//两个栈全空则队列才空
return true;
else
return false;
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
1.一个队列就能模拟栈的实现,因为队列是可以进行双端操作的,所以进行出栈操作时先把除了队尾的队头元素重新插入队列并出队,那么新的队头元素就是最早进入队列的元素即栈顶元素。
2.和用栈模拟队列实现一样,需要返回栈顶元素值。进行出栈时,需要先找一个变量保存栈顶元素值,然后出队,最后返回保存的栈顶元素值完成模拟。
class MyStack {
public:
queue<int> que;//定义一个队列
MyStack() {
}
void push(int x) {
que.push(x);//直接入队
}
int pop() {
int size=que.size();//计算队列大小
size--;
while(size--){//除了队尾元素,依次将队头元素插入队尾并出栈
que.push(que.front());
que.pop();
}
int result=que.front();//出栈先保存队头元素
que.pop();
return result;
}
int top() {
return que.back();//栈的栈顶就是队列的队尾
}
bool empty() {
return que.empty();//直接判空就行
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
今日总结:最轻松的一集。