PTA 7-22 堆栈模拟队列(25 分)c++模拟队列

本文介绍了一种使用两个堆栈模拟队列的方法,并通过C++实现了解决方案。面对特定的操作指令,如入队、出队等,该方法能够有效地处理队列的满和空状态,同时对比了模拟队列与实际队列的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
#include<bits/stdc++.h> 
using namespace std;
stack<int>s1;  
stack<int>s2;  
  
int main()
{  
    int m,n,i,a;  
    char c;  
    cin>>m>>n;  
    if(m>n)
		swap(m,n);  
    while(1)
	{  
        cin>>c;  
        if(c=='T')  
            return 0;
        if(c=='A')
		{  
            cin>>a;  
            if((s1.size()==m)&&(s2.size()!=0))
                cout<<"ERROR:Full"<<endl;  
            else
			{  
                int len1,t;  
                if(s1.size()==m)
				{  
                    len1=s1.size();  
                    while(len1--)
					{  
                        t=s1.top();  
                        s1.pop();  
                        s2.push(t);  
                    }  
                    s1.push(a);  
                }  
                else if(s1.size()!=m)
                    s1.push(a);  
            }  
        }  
        else if(c=='D')
		{  
            if((s1.size()==0)&&(s2.size()==0)) 
                cout<<"ERROR:Empty"<<endl;   
            else
			{  
                int len2;  
                if(s2.size()==0)
				{  
                    len2=s1.size();  
                    while(len2--)
					{  
                        int t=s1.top();  
                        s1.pop();  
                        s2.push(t);  
                    }  
                    cout<<s2.top()<<endl;  
                    s2.pop();  
                }  
                else if(s2.size()!=0)
				{  
                    cout<<s2.top()<<endl;  
                    s2.pop();  
                }  
            }  
        }  
    }  
    return 0;  
}
说一下这道题的解题思路,用c++堆栈模拟队列,输入两个堆栈的长度,长度短的作为输入栈,长的作为输出栈,如果输入栈满了但输出栈不空,此时不能再输入了,为栈满,其他情况都可以输入,如果输入栈满了,输出栈为空,就可以将输入栈的元素转移到输出栈,再向输入栈添加元素,如此就可以实现模拟队列的功能
后来我用c++队列做了一下,只能过一个样例,模拟队列和真实队列还是有本质的区别的
#include<bits/stdc++.h> 
using namespace std;
queue<int> q; 
  
int main()
{  
    int m,n,i,a;  
    char c;  
    cin>>m>>n;  
    n+=m;	
    for(i=0;;i++)
	{  
        cin>>c;  
        if(c=='T')  
            return 0;
        if(c=='A')
		{  
            cin>>a;  
            if(q.size()==n)
			{
                cout<<"ERROR:Full"<<endl;  
            }  
            else
			{  
                q.push(a);  
            }  
        }  
        else if(c=='D')
		{  
            if(q.size()==0)
			{  
                cout<<"ERROR:Empty"<<endl;  
            }  
            else
			{  
                cout<<q.front()<<endl;  
                q.pop();   
            }  
        }  
    }  
    return 0;  
}

### PTA 7-2 银行业务队列模拟实现解法 此问题的核心在于通过队列模拟银行业务窗口的处理过程。以下是基于题目描述的一个具体解决方案。 #### 数据结构设计 为了高效解决该问题,可以采用两个独立的队列别表示 A 和 B 窗口等待服务的顾客序列。由于 A 窗口的服务效率是 B 的两倍,在每次循环中需按照比例配资源并更新状态[^1]。 #### 关键逻辑析 程序的主要流程包括以下几个方面: 1. 初始化输入数据以及定义用于存储结果的列表。 2. 循环判断当前是否有待处理客户,并依据规则决定哪个窗口先完成业务。 3. 当某个窗口完成一位客户的业务后,立即将其加入到最终的结果序列中;如果存在多个窗口同时结束,则遵循“A优先”的原则输出。 下面提供了一个 Python 版本的具体实现: ```python from collections import deque def bank_service(customers): queue_A, queue_B = deque(), deque() result = [] index = 0 while customers or queue_A or queue_B: # 添加新来的顾客进入对应队列 if customers and (not queue_A or not queue_B): customer = customers.pop(0) if not queue_A: queue_A.append(customer) elif not queue_B: queue_B.append(customer) served_A = False served_B = False # 处理A窗口 if queue_A: queue_A.popleft() served_A = True # 如果A已经服务过一次则尝试B if queue_B and ((served_A and len(queue_A)==0) or not served_A ): queue_B.popleft() served_B = True # 输出已完成客户服务顺序 if served_A: result.append('A') if served_B: result.append('B') return ''.join(result) if __name__ == "__main__": input_customers = list(input().strip())[::-1] output_sequence = bank_service(input_customers) print(output_sequence) ``` 上述代码实现了基本的功能需求,即根据不同的服务能力安排合适的调度策略,并记录下实际被服务完毕的次序。 #### 注意事项 在实际编码过程中需要注意边界条件的处理,比如初始状态下可能只有一个窗口可用等情况下的特殊情形管理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值