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

剑指Offer:面试题7 用两个栈实现队列

2014-09-06 01:07 579 查看
/*
用两个队列实现一个栈:
通过栈的操作分析队列模拟栈的过程。
先往栈内压入一个元素a,把a压入queue1,接下来继续往栈内压入b、c两个元素,把他们都插入到queue1:{a,b,c},
从栈内弹出一个元素:
应该将c弹出,但c在尾部,先在queue1中删除元素a,b,并插入到queue2中,再从queue1中删除元素c。
说白了,两个队列互相利用,除最后一个元素以外的其余元素全部放到另一个队列,删除另一个队列中最后一个元素
。
往栈内压入元素d到queue1的尾部,再弹出一个元素,这时被弹出的应该是d,先从头部删除queue1的元素并插入到
queue2中,知道在queue1中遇到d再直接把它删除。

输入:
abcdx
输出:
dcba
*/

/*
关键:
1 if(!queue1.empty() && queue2.empty())//当1个队列为空,令一个队列不空时,就把除最后一个元素的其余元素压入到另一个队列中
{
while(queue1.size() > 1)//确保queue1中至少有两个元素
2 
*/

#include <queue>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

template<typename T>
class CStack
{
public:
CStack(){}
virtual ~CStack(){}
void push(const T& element);
T pop();
bool empty()
{
if(queue1.empty() && queue2.empty())
{
return true;
}
else
{
return false;
}
}
private:
queue<T> queue1;
queue<T> queue2;
};

template<typename T>
void CStack<T>::push(const T& element)
{
if(!queue2.empty())//压入哪个队列,压入的队列应该是不空的队列,如果两个队列同时为空,就压入到queue1中
{
queue2.push(element);
}
else//其余情况包括queue2为空和queue1不管为不为空的情形
{
queue1.push(element);
}
}

template<typename T>
T CStack<T>::pop()
{
if(!queue1.empty() && queue2.empty())//当1个队列为空,令一个队列不空时,就把除最后一个元素的其余元素压入到另一个队列中
{
while(queue1.size() > 1)//确保queue1中至少有两个元素
{
queue2.push(queue1.front());
queue1.pop();
}
T& ele = queue1.front();//将queue1中剩余的一个元素弹出即可
queue1.pop();
return ele;
}
else if(queue1.empty() && !queue2.empty())//当1个队列为空,令一个队列不空时,就把除最后一个元素的其余元素压入到另一个队列中
{
while(queue2.size() > 1)//确保queue1中至少有两个元素
{
queue1.push(queue2.front());
queue2.pop();
}
T& ele = queue2.front();//将queue1中剩余的一个元素弹出即可
queue2.pop();
return ele;
}
//如果两个队列均为空,抛出异常
if(queue1.empty() && queue2.empty())
{
throw new exception("Stack is empty!");
}
}

void process()
{
CStack<char> cstack;
char ch;
while(EOF != scanf("%c",&ch))
{
if(ch == 'x')
{
break;
}
cstack.push(ch);
}
while(!cstack.empty())
{
printf("%c",cstack.pop());
}
}

int main(int argc,char* argv[])
{
process();
getchar();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: