队列的特点是先入后出,栈的特点与之相反,是后入先出。可以定义两个队列来实现一个栈的功能,定义队列queue1与queue2。
当向该栈中压入元素时:
若queue1与queue2都为空时,可以把该元素加入这2个队列的任一个。
若queue1不为空,queue2为空时,可以把该元素加入队列queue1中。
若queue1为空,queue2不为空时,可以把该元素加入队列queue2中。
当从该栈中弹出元素时:
当queue1与queue2都为空时,则表明该栈为空。
当queue1不为空,queue2为空时,将queue1中元素弹出并依次压入queue2中,直到queue1中剩余一个元素。然后弹出queue1中的这个元素并返回。
当queue1为空,queue2不为空时,将queue2中元素弹出并依次压入queue1中,直到queue2中剩余一个元素。然后弹出queue2中的这个元素并返回。
#include<queue>
template<typename T> class Cstack
{
public:
Cstack();
~Cstack();
void push_val(T val);
bool empty()const
{
return que1.empty()&&que2.empty();
}
size_t size()const
{
return que1.size()+que2.size();
}
T pop_val();
private:
queue<T> que1;
queue<T> que2;
};
template<typename T> Cstack<T>::Cstack()
{
}
template<typename T> Cstack<T>::~Cstack()
{
}
template<typename T> void Cstack<T>::push_val(T val)
{
if(que1.empty())//que1为空,que2可能为空或不为空
que2.push(val);
else //que1不为空,que2一定为空
que1.push(val);
//不可能que1和que2都不为空
}
template<typename T> T Cstack<T>::pop_val()
{
T temp;
if(que1.empty()&&que2.empty())
{
cout<<"Empty stack!"<<endl;
}
else if(!que1.empty()&&que2.empty())//que1不 为空,que2为空
{
while(que1.size()!=1)
{
temp=que1.front();
que1.pop();
que2.push(temp);
}
temp=que1.front();
que1.pop();
return temp;
}
else//que1为空,que2不为空
{
while(que2.size()!=1)
{
T temp=que2.front();
que2.pop();
que1.push(temp);
}
temp=que2.front();
que2.pop();
return temp;
}
}
测试程序:
void test1()
{
Cstack<int> cs;
if(cs.empty())
cout<<"cs is empty!"<<endl;
cout<<"cs size is"<<cs.size()<<endl;
}
void test2()
{
const int len=5;
Cstack<int> cs;
for(int ii=0;ii<len;ii++)
{
int randnum=rand();
cout<<randnum<<" ";
cs.push_val(randnum);
}
cout<<endl;
for(int ii=0;ii<len;ii++)
{
cout<<cs.pop_val()<<" ";
}
}
int main()
{
test1();
test2();
return 0;
}
测试结果: