两个队列模拟一个栈行为;
两个队列q1,q2,队列构造函数默认构造两个空队列。
将元素入队到q1中,经过一系列入队操作,q1非空,含有n个元素,q2为空队;
将q1中元素依次出队并入队q2,直至只剩下一个元素, 即q1出队n-1个元素,并依次入队到q2中。
此时,q1中仅剩的唯一一个元素,是期初队列最后入队的元素,将该元素删除(pop),就模拟完成了栈的栈顶元素出栈;在删除之前取出该元素,就模拟完成了取栈顶元素 ,这和栈的后进先出一致
此时,q1,为空,q2非空,接下来要做的就是循环的对非空队列入队,取最后一个元素
//两个队列模拟栈
class SimulateStack
{
public:
SimulateStack(){ count = 0;}
~SimulateStack(){ }
void simPush(int); //模拟入栈
void simPop(); //模拟出栈
int simTop();//取栈顶元素
int simSize();//计算栈元素个数;
bool simEmpty();
private:
queue<int> q1;
queue<int> q2;
int count;
};
//入栈
inline
void SimulateStack::simPush(int num)
{
if (!q1.empty())
{
q1.push(num);
}
else
q2.push(num);
count++;
}
//出栈
inline
void SimulateStack::simPop()
{
//int tmp;
if (!q1.empty())
{
while (q1.size()!=1)
{
q2.push(q1.front());
q1.pop();
}
//tmp = q1.front();
q1.pop();
}
else
if (!q2.empty())
{
while (q2.size()!=1)
{
q1.push(q2.front());
q2.pop();
}
//tmp = q2.front();
q2.pop();
}
--count;
}
//取栈顶元素
inline
int SimulateStack::simTop()
{
int tmp;
if (!q1.empty())
{
tmp = q1.back();
}
else
{
if (!q2.empty())
{
tmp = q2.back();
}
}
return tmp;
}
inline
int SimulateStack::simSize()
{
return count;
}
inline
bool SimulateStack::simEmpty()
{
return (count == 0);
}
int main()
{
SimulateStack st;
st.simPush(1);
st.simPush(2);
st.simPush(3);
st.simPush(4);
st.simPush(5);
int st_size = st.simSize(); cout << "stack size: "<<st_size<<endl; //栈顶元素为5, cout << "top element: " << st.simTop(); //5出栈 st.simPop(); cout <<endl; //此时栈顶元素为4,取栈顶元素 cout <<"current top element:" << st.simTop() <<endl;
}
结果输出,取栈顶元素5,然后5出栈,此时栈顶元素为4,符合后进先出原则;

浙公网安备 33010602011771号