第三章作业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;
}
posted @ 2020-10-17 17:20  小豆aa  阅读(532)  评论(0编辑  收藏  举报