• 第三章作业PTA 7-4 堆栈模拟队列 (25分)


    7-4 堆栈模拟队列 (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()。
    
    输入格式:输入首先给出两个正整数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,然后再从A转到B,这时候这些数据反过来了,从B出来的就是队列那种先进先出的形式了。所以我们可以分三种考虑的情况:
     T的时候直接break
     A的时候是入队,所以看看输入栈A情况:
     若A不满,直接压A栈;若A满B空,把A中所有元素出栈压到B中,再把刚输入的元素压A栈。否则,full
     D的时候出队,所以看看能不能出
     若B不为空,直接出;若B空A空,输出empty;若B空A不空,把A中所有元素压B中
    

    C++ AC代码

    #include <iostream>
    #include <bits/stdc++.h>
    using namespace std;
    //int转字符串的函数
    string int_to_string(int num)
    {
    stringstream ss;
    ss<<num;
    string s;
    ss>>s;
    return s;
    }
    int main()
    {
    //A存放的栈 B缓冲区
    stack<int> A;
    stack<int> B;
    vector<string> strs;
    int max_A_size,max_B_size;
    cin>>max_A_size>>max_B_size;
    
    if(max_A_size>max_B_size)
    {
        swap(max_A_size,max_B_size);
    }
    char c;
    while(1)
    {
        cin>>c;
        //T的情况
        if(c=='T')
        {
            break;
        }
        //A的情况
        else if(c=='A')
        {
            int num;
            cin>>num;
            //A不满
            if(A.size()<max_A_size)
            {
                A.push(num);
            }
            //A满,B空
            else if(A.size()==max_A_size&&B.empty())
            {
                 for(int i=0; i<max_A_size; i++)
                    {
                        B.push(A.top());
                        A.pop();
                    }
                    A.push(num);
            }
            else
            {
                 strs.push_back("ERROR:Full");
            }
        }
        //D的情况
        else
        {
            //B不空,就出去
            if(!B.empty())
            {
                strs.push_back(int_to_string(B.top()));
                //cout<<B.top()<<"h"<<endl;
                B.pop();
            }
            //B空A不空
            else if(B.empty()&&A.size()!=0)
            {
                int len=A.size();//重点! 在这里将全部元素都放进缓冲区栈的时候,每放一个size都会变化,要注意!
                for(int i=0; i<len; i++)
                    {
                        B.push(A.top());
                        //cout<<A.top()<<"s"<<endl;
                        A.pop();
    
                    }
                strs.push_back(int_to_string(B.top()));
                B.pop();
            }
            //队空
            else if(B.empty()&&A.size()==0)
            {
               strs.push_back("ERROR:Empty");
            }
        }
    }
     //将刚才暂存于vector的数据遍历输出
    for(vector<string>::iterator it=strs.begin();it!=strs.end();it++)
    {
        cout<<(*it)<<endl;
    }
    return 0;
    }
  • 相关阅读:
    ARCDesktop 学习笔记(一) 添加地图图层
    ARCGIS 开发常用技巧参考
    关于引用动软代码 找不到dll命名空间问题
    银行转账手续费
    Silverlight 笔记
    地图API
    (转)使用ImageBrush替换PictureMarkerSymbol以加强graphic显示性能
    WPF 网摘
    ArcCatalog添加GISserverIP问题
    ARCGIS 10 中文版 3D Analyst Tools等未授权问题
  • 原文地址:https://www.cnblogs.com/douqi/p/13770930.html
Copyright © 2020-2023  润新知