题目
编写一个类,用两个栈实现队列,支持队列的基本操作有(push,pop,top)
解题思路
开始自己的思路有点偏差,想着是在push时就完成从stack1到stack2的迁移,但是实际上并没有必要
push时只进行push操作即可,push向stack1放入一个数据。在pop时,首先判断两个栈是否都为空,若是则当前队列为空;否则必须
在将stack1中的所有元素放入之后才能逐个从stack2逐个pop元素。
在取队列的顶元素时,与pop操作一样,要确定stack1中的元素已经
全部放入stack2中,此时才能返回队列顶元素
具体题解可参考书籍
代码
#include<iostream>
#include<stack>
using namespace std;
class stackToQueue {
private:
stack<int> stack1;
stack<int> stack2;
public:
void mPush(int val);
void mPop();
int mPeek();
};
void stackToQueue::mPush(int val)
{
stack1.push(val);
}
void stackToQueue::mPop()
{
if (stack1.empty() && stack2.empty())
printf("The queue is empty!\n");
else if (stack2.empty())
{
while (!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
}
stack2.pop();
}
int stackToQueue::mPeek()
{
if (stack1.empty() && stack2.empty())
printf("The queue is empty!\n");
else if (stack2.empty())
{
while (!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
}
return stack2.top();
}
int main()
{
stackToQueue myQueue;
for (int i = 0; i < 3; i++)
myQueue.mPush(i);
for (int j = 0; j < 3; j++)
{
cout << myQueue.mPeek() << endl;
myQueue.mPop();
}
for (int i = 3; i < 5; i++)
myQueue.mPush(i);
for (int j = 0; j < 2; j++)
{
cout << myQueue.mPeek() << endl;
myQueue.mPop();
}
getchar();
return 0;
}