【数据结构】 一个数组实现两个栈【面试】
以前,我们实现一个栈,轻轻松松,无需考虑太多因素,即可实现。
现在,要求在一个数组里实现两个栈,那么在数组里怎么实现栈呢?
无非就是下标索引,方法也不局限一种,例如:用奇数下标作为栈s1的结构,用偶数作为s2的结构;再者:一前一后的结构,栈s1从前往后,栈s2从后往前。
本人只想到了使用这两中方法实现,当然,这两种方法各有利弊。
第一种方法,倘若其中一个栈只入了一个元素,而另一个入了很多元素,那么会造成内存碎片,但是此方法有利于数组增容;
第二种方法,空间利用率很高,但是不有利于数组增容。
虽然各有利弊,但是实现的机制相同。
在这里,使用第一种方法实现:
#include<iostream>usingnamespacestd;template<classT>classarrayWithTwoStack{public:arrayWithTwoStack(intsize):top1(-1),top2(-1),_size(size){_array=newT[size+1];}~arrayWithTwoStack(){if(_array){delete[]_array;}}public:voidPush(intindex,Tdata){if(_size%2==0){if((top1>_size-2)||(top2>=_size-1)){cout<<"Stackisoverflow!"<<endl;return;}}else{if((top1>_size-1)||(top2>=_size-2)){cout<<"Stackisoverflow!"<<endl;return;}}0是一号栈,1是二号栈if(index==0){if(top1==-1){top1=0;_array[top1]=data;}else{top1+=2;_array[top1]=data;}}if(index==1){if(top2==-1){top2=1;_array[top2]=data;}else{top2+=2;_array[top2]=data;}}}TPop(intindex){intret;if(index==0){if(top1<0){return-1;cout<<"Stackisunderflow!"<<endl;}else{ret=_array[top1];top1-=2;}}if(index==1){if(top2<1)//top2从下标为1开始{return-1;cout<<"Satckisunderflow!"<<endl;}else{ret=_array[top2];top2-=2;}}returnret;}Ttop(intindex)//返回栈顶元素{if(index==0&&top1>=0){return_array[top1];}if(index==1&&top2>=1){return_array[top2];}cout<<"NoTop!"<<endl;exit(0);}boolisEmpty(intindex){if(index==0&&top1<0)returnfalse;if(index==1&&top2<1)returnfalse;returntrue;}voidShow(){if(top1<0&&top2<1){cout<<"Stackhasnodata!"<<endl;return;}else{for(inti=0;i<_size;i++)cout<<_array[i]<<"";}cout<<endl;}private:Ttop1;Ttop2;int_size;T*_array;};intmain(){arrayWithTwoStack<int>s(10);s.Push(0,0);s.Push(0,2);s.Push(0,4);s.Push(1,1);s.Push(1,3);s.Push(1,5);s.Push(1,7);s.Push(0,6);s.Push(0,8);s.Push(1,9);s.Push(0,10);s.Show();cout<<s.Pop(0)<<"";cout<<s.Pop(0)<<"";cout<<s.Pop(0)<<"";cout<<s.Pop(0)<<endl;cout<<s.Pop(1)<<"";cout<<s.Pop(1)<<"";cout<<s.Pop(1)<<"";cout<<s.Pop(1)<<endl;cout<<s.top(0)<<endl;cout<<s.top(1)<<endl;s.Pop(0);cout<<(s.isEmpty(0)?"Yes":"No")<<endl;cout<<(s.isEmpty(1)?"Yes":"No")<<endl;system("pause");return0;}
若有纰漏,欢迎指正。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。