LeetCode 232.用栈实现队列
class MyQueue {
public:
stack<int>stin;
stack<int>stout;
MyQueue() {
}
void push(int x) {
stin.push(x);
}
int pop() {
if(stout.size()){
int res=stout.top();
stout.pop();
return res;
}
while(stin.size()){
int a=stin.top();
stin.pop();
stout.push(a);
}
int res=stout.top();
stout.pop();
return res;
}
int peek() {
if(stout.size())return stout.top();
else{
while(stin.size()){
int a=stin.top();
stin.pop();
stout.push(a);
}
}
return stout.top();
}
bool empty() {
if(stin.size()==0 && stout.size()==0){
return true;
}
return false;
}
};
比较简单吧,唯一要注意的就是在stl库中,stack的pop不会返回弹出值,要多一步存储值,不然可以写的更简单。
还有一点要注意,就是每次将stin中的元素转移到stout中时,要全部转移完,并且要等stout弹出完后再将stin中元素转移入stout。
LeetCode 225. 用队列实现栈
class MyStack {
public:
queue<int> q;
MyStack() {
}
void push(int x) {
q.push(x);
}
int pop() {
if(q.size()==1){
int m=q.front();
q.pop();
return m;
}//在插入元素只有一个时,不加判断条件,会陷入死循环
int x=q.front(),a=q.front();//先用a存储为首端元素,x为临时元素
q.pop();//弹出首端
while(q.front()!=a){//如果没有碰到再次插入的首端元素,就一直循环。
q.push(x);//插入的x始终是上一次循环删除的元素
x=q.front();
q.pop();
}
return x;
}
int top() {
if(q.size()==1){
return q.front();
}
int x=q.front(),a=q.front();
q.pop();
while(q.front()!=a){
q.push(x);
x=q.front();
q.pop();
}
q.push(x);//这里最后再插入一次x,使队列恢复原样
return x;
}
bool empty() {
if(q.size()==0)return true;
return false;
}
};
这里和卡哥有所不同,我不知道可以直接返回que.back
,top的实现比较复杂