题目:
用两个栈实现一个队列。
思路:
[1] 入队列就直接把数据放到第一个栈里
[2] 出队列就判断第二个栈是否为空,不为空的话,第二个栈直接出栈结果就是出队列,若为空就把第一个栈里的数据转移到第二个栈里,然后第二个栈再出栈
代码:
#include <iostream>
#include <stack>
using namespace std;
//功能:用两个栈实现一个队列的添加元素和删除元素功能
//添加:直接在栈1内添加
//删除:判断栈2是否为空,如果不为空,则直接从栈2中删除,如果为空,则把栈1的元素搬到栈2中,然后删除栈2的栈顶即可
template <typename T>
class CQueue
{
public :
CQueue(){};
~CQueue(){};
void appendTail(const T& node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
template<typename T> void CQueue<T>::appendTail(const T& element)
{
stack1.push(element);
}
template<typename T> T CQueue<T>::deleteHead()
{
//如果stack2为空,则把stack1的内容全部挪过来,否则,直接删除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;
}
int main()
{
CQueue<int> q;
q.appendTail(1);
q.appendTail(2);
q.appendTail(3);
q.appendTail(4);
q.appendTail(5);
q.deleteHead();
}
相关题目:
用两个队列实现一个栈。
思路:
[1] 始终有一个队列为空。入栈就把数据放到非空的队列。
[2] 出栈就把非空的队列的除了最后一个数据,其他数据都转移到另一个队列,然后让最后一个数据出队列就是出栈。
代码:
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
//功能:用两个队列实现一个栈
//[1] 始终有一个队列为空。入栈就把数据放到非空的数列
//[2] 出栈就把非空的队列的除了最后一个数据,其他数据都转移到另一个队列,然后让最后一个数据出队列就是出栈。
template <typename T>
class CStack
{
public :
CStack(){};
~CStack(){};
void pushback(const T& node);
T popback();
private:
queue<T> queue1;
queue<T> queue2;
};
//入栈
template<typename T> void CStack<T>::pushback(const T&node)
{
if(queue1.empty() && queue2.empty())
queue1.push(node);
else
if(!queue1.empty())
queue1.push(node);
else
queue2.push(node);
}
//出栈
template<typename T> T CStack<T>::popback()
{
if(queue1.empty() && queue2.empty())
throw new exception("stack is empty");
if(!queue1.empty())
{
while(queue1.size() != 1)
{
T tmp = queue1.front();
queue1.pop();
queue2.push(tmp);
}
T result = queue1.front();
queue1.pop();
return result;
}
else
if(!queue2.empty())
{
while(queue2.size() != 1)
{
T tmp = queue2.front();
queue2.pop();
queue1.push(tmp);
}
T result = queue2.front();
queue2.pop();
return result;
}
}
int main()
{
CStack<int> data;
data.pushback(1);
data.pushback(2);
data.pushback(3);
data.popback();
data.popback();
}