文档讲解:代码随想录
第十天,国庆之后的一天,来深圳玩了,捎上电脑边学边玩,主打一个时间管理。栈和队列,开卷!
232.用栈实现队列
感受:用栈实现队列,首先得对队列操作很熟悉,其次是思维。说难也不难。说简单也不简单,只是刚好我不会罢了(我在说什么..)
思路:首先我们都知道栈和队列的结构特点,FILO和FIFO。那么用栈实现队列的操作,我们需要借用两个栈来模拟元素进出队列。一个为进栈,元素依次进入后,为了保证输出元素的次序与队列一致,我们需要再使用一个出栈。出栈就是将从进栈中弹出的、与队列输出的元素顺序不符的元素压入,而与队列输出元素顺序相同的元素则直接可以由进栈弹出。这样,就用两个栈来保证元素的输出与队列一致。peek()函数的操作其实相当于前面描述的pop(),只不过我们在这个函数中只需要读取元素即可,因此就比pop()多了一步将元素压入栈中的操作。值得一提的是,我们在peek()函数中可以直接通过this指针访问pop()函数,这样一来就方便多了。
class MyQueue {
public:
stack<int> stackIn;
stack<int> stackOut;
MyQueue() {
}
void push(int x) {
stackIn.push(x);
}
int pop() {
//只有出栈元素为空时我们才从入栈中导入元素
if(stackOut.empty()){
//并且如果入栈中有元素我们就持续导入
while(!stackIn.empty()){
stackOut.push(stackIn.top());
stackIn.pop();
}
}
int result = stackOut.top();
stackOut.pop();
return result;
}
int peek() {
int res = this->pop();
stackOut.push(res);
return res;
}
bool empty() {
return stackOut.empty() && stackIn.empty();
}
};
/**
* 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();
*/
笔记:工作中懂得函数复用很重要!
225.用队列实现栈
感受:跟上题差不多,颠倒过来之后思路是差不多的。
思路: 本题可以用一个队列来实现栈的功能。我们先将元素压入队列一中,再将队列一的元素存入队列二中,然后逐个弹出,但要留下最后一个元素作为返回结果。最后再将队列二的元素清空即可。
class MyStack {
public:
queue<int> quque1;
queue<int> quque2;
MyStack() {
}
void push(int x) {
quque1.push(x);
}
int pop() {
int size = quque1.size();
size--;
//将quque1数据导入quque2,但留下最后一个元素
while(size--){
quque2.push(quque1.front());
quque1.pop();
}
//res作为最后一个元素返回
int res = quque1.front();
quque1.pop();
//将quque2赋给quque1,并清空quque2
quque1 = quque2;
while(!quque2.empty()){
quque2.pop();
}
return res;
}
int top() {
return quque1.back();
}
bool empty() {
return quque1.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();
*/
变量名有拼写错误,无伤大雅,不要介意。关于pop()函数里的逻辑本人尚未完全理解透彻,可能还是练的少的缘故,虽然很好懂,但总感觉如果让自己写是不好写出来的。
总结:今天题比较少,而且我是提前一天完成的,好方便第二天旅游哈哈。总用时3h,要注意之后还是要温故而知新呀。