设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。
所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数:
int IsFull(Stack S)
:判断堆栈S
是否已满,返回1或0;int IsEmpty (Stack S )
:判断堆栈S
是否为空,返回1或0;void Push(Stack S, ElementType item )
:将元素item
压入堆栈S
;ElementType Pop(Stack S )
:删除并返回S
的栈顶元素。
实现队列的操作,即入队void AddQ(ElementType item)
和出队ElementType DeleteQ()
。
输入格式:
输入首先给出两个正整数N1
和N2
,表示堆栈S1
和S2
的最大容量。随后给出一系列的队列操作:A item
表示将item
入列(这里假设item
为整型数字);D
表示出队操作;T
表示输入结束。
输出格式:
对输入中的每个D
操作,输出相应出队的数字,或者错误信息ERROR:Empty
。如果入队操作无法执行,也需要输出ERROR:Full
。每个输出占1行。
输入样例:
3 2
A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T
输出样例:
ERROR:Full
1
ERROR:Full
2
3
4
7
8
ERROR:Empty
思路:
1.先把栈各种要求的操作列出
2.用两栈(先进后出)模拟队列(先进先出),两个队列S1,S2(先入S1再出S2进S2出S2)
3.还可以入栈条件:①S1,S2都空②S1有,S2空,将S1中出栈入S2,然后将入S1栈
不可以入栈条件:①S1满S2不空(这种情况就不能入“队列”了)
4.不可以出栈条件:①S1,S2都空
可以出栈条件:①S2不空②S1不空就将其元素出栈,压入S2中等待出栈
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct SNode//栈结构体定义
{
int *data;//存储值
int top;//存储栈顶
int MaxSize;//最大值
}SNode,*Stack;
Stack CreateStack(int x)//创建栈
{
Stack p;
p=(Stack)malloc(sizeof(Stack));
p->data=(int *)malloc(sizeof(int)*x);
p->MaxSize=x;
p->top=-1;
return p;
}
//入栈
void push(Stack S,int x)
{
S->data[++S->top]=x;
}
//出栈
int pop(Stack S)
{
int t;
t=S->data[S->top--];
return t;
}
//判断栈满
int IsFull(Stack S)
{
if(S->top==S->MaxSize-1)
return 1;
else
return 0;
}
//判栈空
int IsEmpty(Stack S)
{
if(S->top==-1)
return 1;
else
return 0;
}
int main()
{
int n1,n2,a,b,m;
scanf("%d%d",&a,&b);//输入首先给出两个正整数N1和N2,表示堆栈S1和S2的最大容量
char t;
t=getchar();//输入字符串
//n1为a,b中较小的值那个,n2为较大那个
n1=(a<=b)?a:b;
n2=(a<=b)?b:a;
char order;
//创建两个栈
Stack S1=CreateStack(n1);
Stack S2=CreateStack(n2);
while(1)
{
int flag=0;
order=getchar();//单个字符剖出
switch(order)
{
case 'A':{ //A item表示将item入列
scanf("%d",&m);
getchar();
if(!IsFull(S1)){//若是s1未满,压入S1
push(S1,m);
}
else if(IsFull(S1)&&IsEmpty(S2))//若S1满,S2空
{
while(!IsEmpty(S1))
{
push(S2,pop(S1));
}
push(S1,m);
}
else if(IsFull(S1)&&!IsEmpty(S2)) //若S1满,S2有值未满
{
printf("ERROR:Full\n");//打印满
}
break;
}
case 'D':{//D表示出队操作;
if(!IsEmpty(S2)){//若S2不空,出栈
printf("%d\n",pop(S2));
}else
{
if(!IsEmpty(S1))//若s1不空,就讲S1中值压入S2
{
while(!IsEmpty(S1))
{
push(S2,pop(S1));
}
printf("%d\n",pop(S2)); //S2值出栈,打印
}else{
printf("ERROR:Empty\n");//除此之外,栈空
}
}
break;
}
case 'T':{//T表示输入结束。
flag=1;//flag表示遇见T就变值,以便后面判断结束
break;
}
}
if(flag)break;
}
return 0;
}