题目链接:232.用栈实现队列
方法1:stack1、stack2,在push过程中保证每次都将元素压到stack1的底部,这样在pop或者查看front元素都仅需在stack1顶部执行操作即可。为了实现每次push时将元素压到stack1底部,每次push时将stack1中所有元素存放到stack2中,stack1压入指定元素,将stack2中元素重新存放如stack1。
class MyQueue {
public:
MyQueue() {
}
void push(int x) {
while(!stack1.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
stack1.push(x);
while(!stack2.empty()) {
stack1.push(stack2.top());
stack2.pop();
}
}
int pop() {
int top = stack1.top();
stack1.pop();
return top;
}
int peek() {
return stack1.top();
}
bool empty() {
return stack1.empty();
}
private:
stack<int> stack1, stack2;
};
方法2:stackIn、 stackOut。stackOut中是队列前部的几个元素,stackIn是队列尾部的几个元素。在pop过程中因为需要前部元素,如果stackOut中元素为空,需要将stackIn中元素存入。
class MyQueue {
public:
MyQueue() {
}
void push(int x) {
stackIn.push(x);
}
int pop() {
if(stackOut.empty()) {
while(!stackIn.empty()) {
stackOut.push(stackIn.top());
stackIn.pop();
}
}
int front = stackOut.top();
stackOut.pop();
return front;
}
int peek() {
int front = pop();
stackOut.push(front);
return front;
}
bool empty() {
return stackIn.empty() && stackOut.empty();
}
private:
stack<int> stackIn, stackOut;
};
题目链接:225.用队列实现栈
关键点在于出栈操作,队列只能将front元素pop,stack只能将back(top)元素pop,因此将队列末尾元素移动到front位置就能完成栈。
class MyStack {
public:
MyStack() {
}
void push(int x) {
_que.push(x);
}
int pop() {
for(int i = 0; i < _que.size() - 1; i++) {
_que.push(_que.front());
_que.pop();
}
int top = _que.front();
_que.pop();
return top;
}
int top() {
int result = pop();
push(result);
return result;
}
bool empty() {
return _que.empty();
}
private:
queue<int> _que;
};