剑指Offer 题目7: 两个栈实现队列
Queue.h
#ifndef QUEUE_H
#define QUEUE_H
#include <stack>
template <class T>
class CQueue
{
public:
CQueue(void){};
~CQueue(void){};
void appendTail(const T &element);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
#endif
#include<iostream>
using namespace std;
#include "Queue.h"
/*
template<class T>
CQueue<T>::CQueue()
{
}
template<class T>
CQueue<T>::~CQueue()
{
}
*/
template <class T>
void CQueue<T>::appendTail(const T &element)
{
//入队时,直接压入stack1的栈顶
stack1.push(element);
}
template <class T>
T CQueue<T>::deleteHead()
{
/*
出队时,
若stack2为空,则将stack1的元素弹出并压入到stack2中.
若stack2不为空,则直接弹出stack2的栈顶元素.
*/
if (stack2.size() <= 0)
{
while (stack1.size() > 0)
{
T &data = stack1.top();
stack1.pop();
stack2.push(data);
}
}
if (stack2.size() == 0)
{
throw new exception("queue is empty!");
}
T head = stack2.top();
stack2.pop();
return head;
}
/*
使用两个栈实现队列的功能
*/
#include <iostream>
#include "Queue.cpp"
using namespace std;
int main(void)
{
CQueue<char> q;
//入队
q.appendTail('a');
q.appendTail('b');
q.appendTail('c');
//出队
cout<<q.deleteHead()<<endl;
return 0;
}
两队列实现栈:
/*
使用两个队列实现栈的功能
*/
#include <iostream>
#include <queue>
using namespace std;
queue<char> queue1;
queue<char> queue2;
/*
入栈,两个队列只存在两种情况.
第一种: 两个队列都为空
第二种: 一个为空,另一个不为空.
*/
void myPush(const char &c)
{
//若两个队列都为空,则在queue1中入队
if (queue1.size() == 0 && queue2.size() == 0)
{
queue1.push(c);
}
//若queue1不为空(即queue2为空),则queue1可直接入队
else if (queue1.size() != 0)
{
queue1.push(c);
}
//若queue2不为空(即queue1为空),则queue2可直接入队
else if (queue2.size() != 0)
{
queue2.push(c);
}
}
//出栈
char myPop()
{
if (queue1.size()==0 && queue2.size()==0)
{
throw new exception("stack is empty!");
}
else if (queue1.size() != 0)
{
//将queue1队尾元素除外的元素出队,并压入queue2中
while (queue1.size() >1)
{
char s = queue1.front();
queue1.pop();
queue2.push(s);
}
//将队尾元素弹出
char cs = queue1.front();
queue1.pop();
return cs;
}
else if (queue2.size() != 0)
{
//将queue2队尾元素除外的元素出队,并压入queue1中
while (queue2.size() >1)
{
char s = queue2.front();
queue2.pop();
queue1.push(s);
}
//将队尾元素弹出
char cs = queue2.front();
queue2.pop();
return cs;
}
}
int main(void)
{
//入栈
myPush('a');
myPush('b');
myPush('c');
//出栈
cout << myPop() <<endl;
cout << myPop() << endl;
myPush('d');
cout << myPop() << endl;
return 0;
}