来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-queue-using-stacks
题目描述:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
输入:
[“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]
解题思路:
-
不管底层用什么结构实现,永远保证数据先进先出的一个逻辑数据结构,即队列
-
创建栈st1和st2,入队直接在栈st1进行入队操作,
-
出队时,若st2不空,直接出栈即是出队,若st2已为空,则把栈st1里面的所有数据导入st2
-
获取队头元素时,若st2不空,就去栈顶元素即为队头,若为空,则需要把栈st1里面的所有数据导入st2
-
判断队列是否为空,需要满足两个栈都为空时整个队列才为空
class MyQueue {
public:
MyQueue() {
}
void push(int x) {
st1.push(x);
}
int pop() {
/*
stack<int>* emptyS = &st1;
stack<int>* nonemptyS = &st2;
if(!st1.empty())
{
swap(emptyS,nonemptyS);
}
int top = nonemptyS->top();
nonemptyS->pop();
return top;
*/
int retval;
if(!st2.empty())
{
retval = st2.top();
st2.pop();
return retval;
}
while(!st1.empty())
{
st2.push(st1.top());
st1.pop();
}
retval = st2.top();
st2.pop();
return retval;
}
int peek() {
/*
if(!st1.empty())
{
// int top1 = st1.top();
//st1.pop();
st2.push(st1.top());
return st2.top();
}
else
{
// int top2 = st2.top();
// st2.pop();
st1.push(st2.top());
return st1.top();
}
*/
int retval;
if(!st2.empty())
{
retval = st2.top();
return retval;
}
while(!st1.empty())
{
st2.push(st1.top());
st1.pop();
}
return st2.top();
}
bool empty() {
return st1.empty() && st2.empty();
}
private:
stack<int> st1;
stack<int> st2;
};