设已知有两个堆栈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
解题思路:
堆栈a和b,a用作入队,b出队
(1)判队满:如果a满且b不为空,则队满
(2)判队空:如果a和b都为空,则队空
(3)入队:首先判队是否满。
若队不满:(1)栈a若不满,则直接压入栈a
(2)若a满,则将a中的所有元素弹出到栈b中,然后再将元素入栈a
(4)出队:(1)若b空就将a中的所有元素弹出到栈b中,然后出栈
(2)b不空就直接从b中弹出元素
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 int main() 6 { 7 int stack1[1000],stack2[1000]; 8 int top1=-1,top2=-1; 9 char c; 10 int temp; 11 int n1,n2; 12 scanf("%d %d",&n1,&n2); 13 if( n1>n2 ) 14 { 15 //容量小的作为第一个输入栈 16 temp = n1; 17 n1 = n2; 18 n2 = temp; 19 } 20 21 while(1) 22 { 23 scanf("%c",&c); 24 if( c=='T') break; 25 else if( c=='A') 26 { 27 scanf("%d",&temp); 28 if( top1==n1-1 && top2!=-1) 29 { 30 //栈1满,栈2不为空 31 printf("ERROR:Full\n"); 32 } 33 else if( top1==n1-1) 34 { 35 //栈1满,栈2为空 36 while( top1>-1 ) 37 { 38 //栈1出栈到栈2 39 stack2[++top2] = stack1[top1--]; 40 } 41 stack1[++top1] = temp; 42 } 43 else stack1[++top1] = temp; 44 } 45 else if( c=='D') 46 { 47 if( top2!=-1) 48 printf("%d\n",stack2[top2--]); 49 else if( top2==-1 && top1!=-1) 50 { 51 while(top1>-1) 52 { 53 stack2[++top2] = stack1[top1--]; 54 } 55 56 printf("%d\n",stack2[top2--]); 57 } 58 else printf("ERROR:Empty"); 59 } 60 } 61 62 return 0; 63 }