您的位置:首页 > 职场人生

面试题(两个栈实现一个队列和两个队列实现一个栈)

2017-09-26 09:25 260 查看
面试题(判断元素出栈入栈顺序的合法性。)

面试题(实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1))

1,两个栈实现一个队列

我们知道栈是后进先出的,而队列是先进先出的

我们创建两个栈input(输入栈),output(输出栈)

我们用input(输入栈)来负责入队,而output(输出栈)来负责出队(反向)

出队是,如果output不为空,则先从output中出队,如果output为空,则需要把input中所有元素压入output中。

图解:



下面是代码实现部分

#include<iostream>
#include<stack>
using namespace std;

template<class T>
class Queue
{
public:
void Push(const T&x)//在队尾插入数据
{
input.push(x);
}
void Pop()//删除队头数据
{
if (input.empty() && output.empty())
{
return;
}
if(output.empty())//如果输出栈为空
{
while (!input.empty())//当输入栈不为空时
{
output.push(input.top());//将输入栈栈顶的元素添加到输出栈
input.pop();//删除输入栈元素
}
}
output.pop();//删除输出栈元素(也就是出队)
}
T &Front()
{
if (input.empty() && output.empty())//如果输入栈输出栈都为空
{
return 0;//返回
}
if (output.empty())//
{
while (!input.empty())
{
output.push(input.top());
input.pop();
}
return output.top();
}
else
{
return output.top();
}
}

protected:
stack<int> input;//输入栈
stack<int> output;//输出栈

};

void test1()
{

Queue<int> l;
l.Push(1);
l.Push(2);
l.Push(3);
l.Push(4);

cout << l.Front() << endl;
l.Pop();
l.Pop();
cout << l.Front() << endl;
}


两个队列实现一个栈

与两个栈实现一个队列不同的是:这个所创建的队列是相等地位的,而上面一个负责入队,一个负责出队。

我们在这里是创建了两个队列分别为q1,q2。

比如在q1中压栈了1,2,3,4,q2是空的,要出“栈”,实际上要出q1中的最后一个元素,我们将q1中除最后一个元素之外的其他元素全部放去q2中(所有元素顺序不会改变),这样在q1中留下的元素就是要pop()的栈顶元素,然后在pop(q1.top())

这里需要注意的是,无论q1,q2怎么来回倒,我们要保证有一个队列是空的,用空的队列来临时存放除队尾外的所有元素。

先来看一下Push():如果q1为空,则在q1中push(),如果q2为空,则在q2中push(),如果两个都为空,则我们规定在q1中push()。

下面是Pop:如果q1不为空,我们将q1中除最后一个元素之外,都移动到q2中,然后删除q1中最后一个元素(也就是删除栈顶元素),反之同理

图解:



代码实现

#include<iostream>
#include<queue>
using namespace std;

template<class T>
class Stack
{
public:
void Push(const T&x)
{
if(!q1.empty())//如果q1不为空
{
q1.push(x);
}
else if (!q2.empty())//如果q2不为空
{
q2.push(x);
}
else//q1,q2都为空
{
q1.push(x);
}
}
void Pop()
{
if (!q1.empty())//如果q1不为空
{
while (q1.size() > 1)//将q1中除最后一个元素之外,都移动到q2中
{
q2.push(q1.front());
q1.pop();
}
q1.pop();//删除q1中最后一个元素(也就是删除栈顶元素)
}
else
{
while (q2.size() > 1)
{
q1.push(q2.front());
q2.pop();
}
q2.pop();
}

}
T Top()
{
if (!q1.empty())
{
while (q1.size() > 1)
{
q2.push(q1.front());
q1.pop();
}
return q1.front();
}
else
{
while (q2.size() > 1)
{
q1.push(q2.front());
q2.pop();
}
return q2.front();
}
}
protected:
queue<int> q1;
queue<int> q2;
};

void test()
{

Stack<int> l;
l.Push(1);
l.Push(2);
l.Push(3);
l.Push(4);

cout << l.Top() << endl;
l.Pop();
l.Pop();
cout << l.Top() << en
ae9c
dl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: