题目一:
用两个栈来实现一个队列,完成队列的push和pop操作。 队列中的元素为int类型。
分析:
入栈都进入stack1, 出栈都是在stack2;当stack2无数据的时候将 stack1全部数据放入stack2中
代码实现:
class Queue
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.size() == 0) //没数据才插入
{
while(stack1.size() > 0)
{
int tmp = stack1.top();
stack1.pop();
stack2.push(tmp);
}
}
if(stack2.size() == 0) //stack2中无数据,则队列为空
{
//此处抛出异常
}
int val = stack2.top();
stack2.pop();
return val;
}
private:
stack<int> stack1;
stack<int> stack2;
};
题目二:
两个队列实现一个栈 ?
过程如下:
分析:
1.弹出时需要移动
2.插入时插入到有数据的那一方
3.开始或栈空插入可以随便选,假定此刻选queue1插入
代码实现如下:
class Stack
{
public:
void push(int val)
{
if (queue1.size() == 0 && queue2.size() == 0) //两边都无数据,放在queue1
queue1.push(val);
else if (queue1.size() == 0) //仅queue1空,则放在queue2中
queue2.push(val);
else //仅queue2空,则放在queue1中
queue1.push(val);
}
int pop()
{
if (queue1.size() == 0 && queue2.size() == 0) // 都没数据
throw new std::exception("Stack is null.");
if (queue1.size() != 0) //数据在queue1中
{
while (queue1.size() != 1) //出queue1的数据到queue2,自己仅剩一个数据
{
int tmp = queue1.front();
queue1.pop();
queue2.push(tmp);
}
int tmp = queue1.front(); //拿到queue1剩的一个数据
queue1.pop(); //出queue1剩的一个数据
return tmp;
}
else //数据在queue2中
{
while (queue2.size() != 1)
{
int tmp = queue2.front();
queue2.pop();
queue1.push(tmp);
}
int tmp = queue2.front();
queue2.pop();
return tmp;
}
}
private:
queue<int> queue1;
queue<int> queue2;
};