题目:
使用队列实现栈的下列操作:
push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空
注意:
你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。
思路:
只能用队列,队列在C++中是queue,一种只能从队头取元素,在队尾插入元素的结构;
而栈需要在 队列的队尾取元素,在队列的队伍插入元素;因此重点是如何实现取元素(top)和删除元素(pop)
可以利用两个队列,
如果是top取元素操作,只需要将第一个队列中全部元素移动到另一个队列中,在此过程中标记最后一次移动的元素就可;
如果是pop删除元素操作,只需要将第一个队列中的除最后元素的所有元素移动到另一个队列,即可;
易错点在于:
pop时,第一个队列中的最后一个元素不能移入第二个中,否则相当于没pop;
由于题中说不会在栈空时调用pop和top,因此代码中没有处理这种情况;
代码:
class MyStack {
public:
/** Initialize your data structure here. */
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {
data1.push(x);
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
int n =data1.size() ;
int ret = -999;
while(n--){
if(n == 0){
ret = data1.front();
data1.pop();
}
else{
data2.push(data1.front());
data1.pop();
}
}
while(!data2.empty())
{
data1.push(data2.front());
data2.pop();
}
return ret;
}
/** Get the top element. */
int top() {
int n =data1.size();
int ret = -999;
while(n--){
data2.push(data1.front());
if(n == 0){
ret = data1.front();
}
data1.pop();
}
while(!data2.empty())
{
data1.push(data2.front());
data2.pop();
}
return ret;
}
/** Returns whether the stack is empty. */
bool empty() {
if(data1.empty())
return true;
return false;
}
private:
queue<int> data1;
queue<int> data2;
};
/**
* 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();
*/