代码随想录刷题随记9-栈和队列相互实现
232.用栈实现队列
leetcode链接
两个栈倒,栈本来是先进后出的,但是队列是先进先出的,把栈倒入另一个栈里面在出栈顺序就变成先进先出了
解题源码:
class MyQueue {
public:
stack<int> mystack1;
stack<int> mystack2;
int size;
MyQueue() {
size=0;
}
void push(int x) {
mystack1.push(x);
size++;
}
int pop() {
if(!mystack2.empty()){
int tmp=mystack2.top();
mystack2.pop();
size--;
return tmp;
}
while(!mystack1.empty()){
mystack2.push(mystack1.top());
mystack1.pop();
}
if(!mystack2.empty()){
int tmp=mystack2.top();
mystack2.pop();
size--;
return tmp;
}
return 0;
}
int peek() {
if(!mystack2.empty()){
int tmp=mystack2.top();
return tmp;
}
while(!mystack1.empty()){
mystack2.push(mystack1.top());
mystack1.pop();
}
if(!mystack2.empty()){
int tmp=mystack2.top();
return tmp;
}
return 0;
}
bool empty() {
return size==0 ? true:false;
}
};
225. 用队列实现栈
leetcode链接
所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。
这道题目就是用一个队列就够了。一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。
主要是因为队列进入不会改变顺序性
这里注意top要通过back取得,也按照pop的思路来,因为top不会抛弃最后一个数会导致顺序有点问题。所以最后一个也得重新出队入队。
解题代码:
class MyStack {
public:
queue<int> que;
int size;
MyStack() {
size=0;
}
void push(int x) {
que.push(x);
size++;
}
int pop() {
int tmp=size-1;
while(tmp>0){
que.push(que.front());
que.pop();
tmp--;
}
int ret=que.front();
que.pop();
size--;
return ret;
}
int top() {
return que.back();
}
bool empty() {
return size==0? true:false;
}
};