本题不涉及算法,涉及到模拟以及数据结构方法的应用,我还不够熟练,需要多练。题干如下;
模拟思路如下:
两个栈分别对应输入端(队尾)和输出端(队头)。
代码如下:
class MyQueue {
public:
stack<int> stkIn;
stack<int> stkOut;
MyQueue() {//初始化
}
void push(int x) {
stkIn.push(x);
}
int pop() {
if(stkOut.empty()){
while(!stkIn.empty()){
stkOut.push(stkIn.top());
stkIn.pop();
}
}
int res;
res = stkOut.top();
stkOut.pop();
return res;
}
int peek() {
int res = this -> pop();
stkOut.push(res);
return res;
}
bool empty() {
return (stkIn.empty() && stkOut.empty());
}
};
实现队头弹出功能时,实际上就是出栈,而出栈可能为空,此时用.empty()方法判断,不为空则是前面加一个!变成!stk.empty(),压入栈就是.push(压入的值)。
要点:①我一开始疑惑,为什么不直接stkOut.push(stkIn.pop())而是要先stkOut.push(stkIn.top())然后再stkIn.pop()。我查了之后才发现pop不返回值,而top返回,所以先要top后再pop。
②函数的复用:注意到在peek函数中:
int res = this -> pop();
利用this ->即可调用函数并获取返回值。