题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
算法描述
这道题目在考研数据结构的时候也做过,用两个栈来实现队列进队、出队的功能是可以实现的。
1、栈(stack)是先进后出(FILO)的数据结构,队列(queue)是先进先出(FIFO)的数据结构,它们都是操作受限的数据结构。
2、在C++语言的容器(STL)中,存在栈容器和队列容器,压栈出栈,进队出队的操作分别是
s
t
a
c
k
.
p
u
s
h
(
)
,
s
t
a
c
k
.
p
o
p
(
)
;
q
u
e
u
e
.
p
u
s
h
(
)
,
q
u
e
u
e
.
p
o
p
(
)
stack.push(),stack.pop();queue.push(),queue.pop()
stack.push(),stack.pop();queue.push(),queue.pop().
取栈顶元素是
s
t
a
c
k
.
t
o
p
(
)
stack.top()
stack.top().
3、在用两个栈实现队列功能时,可用第一个栈模拟进队,第二个栈模拟出队,从第一个栈进栈的元素,依次压入第二个栈,先进入栈中的元素到第二个栈中位置全部反了过来,出队操作的时候就可以执行第二个栈的出栈操作就相当于实现了先进先出的情况,实现了出队操作。
4、如果有新的元素进栈,且第二个栈中还有元素时,例如:
a
,
b
,
c
,
d
a,b,c,d
a,b,c,d元素依次入栈,然后再次出栈进入第二个栈中,此时第二个栈中从上到下元素依次为
a
,
b
,
c
,
d
a,b,c,d
a,b,c,d,如果
a
,
b
a,b
a,b出队,此时栈中还有
c
,
d
c,d
c,d元素,当元素
e
e
e入栈时,马上进入第二个栈就会出现
a
,
b
a,b
a,b出队后下一个出队的是
e
e
e,此时出现错误。所以,只有当第二个栈中的元素全部出栈的时候,才可以将第一个栈中的元素出栈压入第二个栈中。
代码实现
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.empty()) // 如果栈空 才能执行入栈操作
{
while(!stack1.empty()) //如果栈1中存在元素
{
stack2.push(stack1.top()); // 取栈1中栈顶元素压入栈2中
stack1.pop(); // 栈1元素出栈
}
}
int top = stack2.top(); // 取栈顶元素 用于出队操作
stack2.pop(); // 出队后 出栈
return top; // 返回出队元素
}
private:
stack<int> stack1;
stack<int> stack2;
};
代码注解
s t a c k . e m p t y ( ) stack.empty() stack.empty():栈的判空,空栈返回1,不空返回0;