c++实现两个堆栈模拟一个队列

/* 如何用两个堆栈模拟实现一个队列
两个堆栈甲和乙,大小分别为m,n(m>n),通过这两个堆栈模拟一个队列
我认为队列大小为n+1,元素进队列用进入甲模拟,甲的栈顶做队尾
甲的栈底做队列头部,出栈时,用乙做过渡。把甲的元素依次出栈再进入乙,取得队列头部后
,再把元素依次从乙出栈,再进入甲
入栈操作为O(1),出栈操作为O(n)
*/
#include<iostream>
using namespace std;
#define maxsize1 100/*定义大堆栈甲的大小*/
#define maxsize2 2/*定义小堆栈乙的大小*/
#define ERROR -100/*定义异常时的函数返回值*/
typedef struct duizhan1 *SS;/*间接访问大堆栈*/
typedef struct duizhan2 *SSS;/*间接访问小堆栈*/
/*大堆栈*/
struct duizhan1{
int Data[maxsize1];
int top;
};
/*小堆栈*/
struct duizhan2{
int Data[maxsize2];
int top;
};
/*入队*/
void EnQueue(SS Ptrs,int x){
if((Ptrs->top)==maxsize2){
cout<<"full"<<endl;
return;
}/*当元素个数达到n+1时,队列满*/
Ptrs->Data[++(Ptrs->top)]=x;/*用大堆栈栈顶做队尾*/
return;
}
/*出队*/
int DeQueue(SS Ptrs1,SSS Ptrs2){
if(Ptrs1->top==-1){
cout<<"empty"<<endl;
return ERROR;
}/*大堆栈空时表示队列空*/
int a;/*用于存储队列头部*/
while(Ptrs1->top!=-1&&Ptrs2->top!=maxsize2-1)/*大堆栈不空且小堆栈不满时将元素从大堆栈依次取出并放入小堆栈*/
Ptrs2->Data[++(Ptrs2->top)]=Ptrs1->Data[(Ptrs1->top)--];
if(Ptrs1->top==-1)/*大堆栈元素全部进入小堆栈*/
a=Ptrs2->Data[(Ptrs2->top)--];/*此时小堆栈的栈顶即为大堆栈栈底元素,也就是队头*/
else a=Ptrs1->Data[0];/*大堆栈有n+1个元素,此时大堆栈剩一个元素,即为队头*/
while(Ptrs2->top!=-1)
Ptrs1->Data[++(Ptrs1->top)]=Ptrs2->Data[(Ptrs2->top)--];/*再将元素从小堆栈放入大堆栈*/
return a;
}
int main(){
SS S1;
SSS S2;
int n,k,v[3];/*n用来存储队头,k和数组搭配用来存3个元素入大堆栈*/
S1=(SS)malloc(sizeof(struct duizhan1));
S2=(SSS)malloc(sizeof(struct duizhan2));
S1->top=-1;
S2->top=-1;/*初始化大小堆栈*/
for(k=0;k<3;k++){
cin>>v[k];
EnQueue(S1,v[k]);
}/*将3个元素入队*/
n=DeQueue(S1,S2);/*出队*/
cout<<n<<endl;/*输出队头元素值*/
return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值