堆栈模拟队列

以下为我的思路:

用S1,S2两个栈模拟队列的入对和出队

队列的特点是先入队的先出队,后入队的后出队,若想实现该操作就得能用栈S1进行入队操作栈S2进行出队操作(需要满足出队栈的长度大于等于入队栈的长度即S2大与S1的长度)

为什么用两个栈可以模拟队列呢?我们不妨假设先入队元素1和元素2再出队下图为模拟过程

引入栈S2从而逆转出栈方向使得先进先出

写该道题还需要注意:(1)队满条件是S1栈满S2栈不为空(2)注意判断两个栈的大小大的为出队栈

#include<iostream>
#include<cstring>
using namespace std;
typedef struct{//定义栈
	int *data;
	int top;
}Stack;
void InitStack(Stack &S,int N)//初始化栈
{
	S.data=new int[N];//c++语法相当于malloc
	S.top=-1;
}
int IsFull(Stack S,int N)//判断栈是否满了
{
	if(S.top+1==N) return 1;
	else return 0;
}
int IsEmpty(Stack S)//判断是否为空栈
{
	if(S.top==-1) return 1;
	else return 0;
}
void Push(Stack &S,int N)//入栈
{
	S.data[++S.top]=N;//S.top先加一后运算
}
void Pop(Stack &S,int &N)//出栈
{
	N=S.data[S.top--];
}
int main()
{
	int N1,N2,n,ch;
	Stack S1,S2;
	char c;
	cin>>N1>>N2;
	if(N1>N2){//用S2作为出队的栈,如果N1大交换两个的值
		int t=N1;
		N1=N2;
		N2=t;
	}
	InitStack(S1,N1);
	InitStack(S2,N2);
	while(1){
		getchar();//读掉换行
		cin>>c;
		if(c=='A'){
			if((IsFull(S1,N1))&&(!IsEmpty(S2))) //S1栈满S2栈不为空说明满队
            cout<<"ERROR:Full"<<endl;
			else{
				cin>>n;
				if(IsFull(S1,N1)){//S1栈满把S1元素出栈到S2
					while(!IsEmpty(S1)){
						Pop(S1,ch);
						Push(S2,ch);
					}
				}
				Push(S1,n);
			}
		}
		else if(c=='D'){
			if((IsEmpty(S1))&&(IsEmpty(S2))) cout<<"ERROR:Empty"<<endl;//两个都为空栈
			else{
				if(IsEmpty(S2)){//S2空栈把S1元素入栈S2在由S2出栈
					while(!IsEmpty(S1)){
						Pop(S1,ch);
						Push(S2,ch);
					}
				}
				Pop(S2,ch);
				cout<<ch<<endl;
			}
		}
		else if(c=='T') break;
	}
    system("pause");
    return 0;
}

第一次写博客如果有什么需要改进的地方请多多指教 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值