zoukankan      html  css  js  c++  java
  • 7-22 堆栈模拟队列(25 分)

    设已知有两个堆栈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()

    输入格式:

    输入首先给出两个正整数N1N2,表示堆栈S1S2的最大容量。随后给出一系列的队列操作: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
    ");
    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
    ",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
    ",stack2[top2--]);
    57             }
    58             else printf("ERROR:Empty");
    59         }
    60     }
    61 
    62     return 0;
    63 }
    
    
    



    在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!
  • 相关阅读:
    ubuntu下使用golang、qml与ubuntu sdk开发桌面应用 (简单示例)
    Go Revel 学习指南
    Go Revel
    Go Revel
    Go Revel
    Go Revel
    Go Revel
    Go Revel
    Go Revel
    Go Revel
  • 原文地址:https://www.cnblogs.com/yuxiaoba/p/8405424.html
Copyright © 2011-2022 走看看