以下为我的思路:
用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;
}
第一次写博客如果有什么需要改进的地方请多多指教