1、两个队列实现一个栈
两个队列实现一个栈
2、两个栈实现一个队列
【算法思想】
1>设计类
成员变量:给两个栈s1和s2来模拟实现一个队列
成员函数:入队Push()和出队Pop()
2>给两个指向栈对象s1、s2的指针input和output,分别用来入队和出队
3>按照先进先出的方式模拟入队和出队操作
Push:将input指向不空的栈,然后在input中入队
Pop:将input所指栈中的前n-1(n为栈中元素个数)的数据先转移到output所指的栈中,同时pop掉input中的前n-1个元素,最后pop掉input中的最后一个元素,即可实现先进先出。
【代码实现】
/*用两个栈实现一个队列*/
#pragma once
#include <iostream>
#include <stack>
using namespace std;
template <class T>
class Queue
{
public:
void Push(T data)//入队
{
stack<T>* input = NULL;//入队指针
if (!s1.empty())//如果s1不为空,入队指针就指向s1
input = &s1;
else //如果s1为空,入队指针就指向s2
input = &s2;
input->push(data);//在入队指针所指的栈中push数据
}
void Pop()//出队
{
if (s1.empty() && s2.empty())//如果两个栈都为空,说明队列是空的,直接返回
{
cout<<"queue empty!"<<endl;
return;
}
stack<T>* input,*output;//定义入队指针和出队指针
if (s1.empty())//如果s1为空,就将入队指针指向s2,出队指针指向s1
{
input = &s2;
output = &s1;
}
else //如果s1不为空,就将入队指针指向s1,出队指针指向s2
{
input = &s1;
output = &s2;
}
size_t size = input->size();//用临时变量size保存队列中的元素个数
for (size_t i = 0; i < size - 1; ++i)//将入队指针所指栈的前(size-1)个元素转入出队栈
{
output->push(input->top());
input->pop();//同时将转移过的数据删除
}
input->pop();//将最先进入队列的数据出队
swap(input,output);//交换入队和出队指针
}
protected:
stack<T> s1;
stack<T> s2;
};
void TestQueue()
{
Queue<int> q;
q.Push(1);
q.Push(4);
q.Push(3);
q.Push(5);
q.Pop();
q.Pop();
q.