两个栈实现一个队列

用两个栈实现一个队列

算法思想:

(1)stack1用来存储入队的元素,所以入队就是把进来的元素push到stack1;

(2)对于出队列,一开始stack2是空的,所以我们把stack1中的元素全部pop到stack2中,这样stack2的栈顶就是队头,只要stack2不为空,那么每次出队,就相当于stack2的pop;

(3)接下来,每入队一个元素,需要判断stack1是否为空,如果为空,需将stack2的元素pop到stack1,再将入队元素push到stack1。每出队一个元素,如果stack2不为空,就从stack2中pop一个元素,如果stack2不为空,需要重复上面的操作―把stack1中的元素pop到stack2中。

#include<iostream>

#include <stack>

using namespace std;

template<class T>

class Queue

{

public:

void push(const T& x)

{

if (s1.empty())

{

while (!s2.empty())

{

s1.push(s2.top());

s2.pop();

}

}

s1.push(x);

cout << x << endl;

}

void pop()

{

if (s2.empty())

{

while (!s1.empty())

{

s2.push(s1.top());

s1.pop();

}

}

cout << s2.top() << endl;

s2.pop();

}

const T& front()

{

if (s2.empty())

return s2.top();

while (!s1.empty())

{

s2.push(s1.top);

s1.pop();

}

return s2.top();

}

bool isEmpty()

{

return s1.isEmpty() && s2.isEmpty();

}

private:

stack<T> s1;

stack<T> s2;

};

void test()

{

Queue<int> q;

q.push(1);

q.push(2);

q.push(3);

q.push(4);


q.pop();

q.push(5);

q.pop();

}

int main()

{

test();

return 0;


}



你可能感兴趣的:(两个栈实现一个队列)