使用队列实现栈的下列操作:
push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空
注意:
你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。
请先翻阅 LeetCode 用栈实现队列
队列:先进先出特性,只能在队头出队,队尾入队操作。
栈:先进后出特性,只能在栈顶出栈、入栈操作。
双端队列:队头、队尾都可进行入队、出队操作。
方法一:使用deque双端队列的辅助。
双端队列的一些操作:
deque.back(); //获取队尾
deque.front(); //获取队头
deque.pop_back(); //队尾出队
deque.pop_front(); //队头出队
deque.push_back(); //队尾入队
deque.push_front(); //队尾入队
代码实现
class MyStack {
private:
deque<int> myQue;
public:
/** Initialize your data structure here. */
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {//直接放入队列尾部
myQue.push_back(x);
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
int top = myQue.back();//获取队尾
myQue.pop_back();//队尾出队
return top;
}
/** Get the top element. */
int top() {
return myQue.back();//获取队尾
}
/** Returns whether the stack is empty. */
bool empty() {
return myQue.empty();
}
};
/**
* 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();
*/
感觉双端队列体现不出我的思考,还是老老实实使用队列模拟。
方法二:使用队列进行模拟。
class MyStack {
private:
queue<int> myQue;
//将队列的前n-1个元素放到队列的尾部
void myOp(){
int queSize = myQue.size();
for (int i = 1; i < queSize; ++i){
myQue.push(myQue.front());
myQue.pop();
}
}
public:
/** Initialize your data structure here. */
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {//直接放入队列
myQue.push(x);
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
myOp();//将队列的前n - 1个元素放到尾部
int top = myQue.front();
myQue.pop();
return top;
}
/** Get the top element. */
int top() {
myOp();//将队列的前n - 1个元素放到尾部
int top = myQue.front();
myQue.pop();
myQue.push(top);
return top;
}
/** Returns whether the stack is empty. */
bool empty() {
return myQue.empty();
}
};
/**
* 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();
*/