5.18插松枝

//两个while嵌套  用if语句+break跳出  根据当下这枝松枝是否为空来分情况 
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
int n,m,k;
stack<int>s;//小盒子 
queue<int>q;//传送带 
int main(){
	cin>>n>>m>>k;
	for(int i=0;i<n;i++){
		int x;cin>>x;
		 q.push(x);
	}
    while(1){
    	vector<int>v;//松枝
		int flag=0;//小盒子是否满了
		//进行一次松枝制作 
		while(1){
		   if(v.empty()){//松枝是空的 
		   	 if(!s.empty()) v.push_back(s.top()),s.pop();//小盒子不是空
			 else if(!q.empty()) v.push_back(q.front()),q.pop();//传送带不是空  
			 else break;//退出 
		   }
		   else{
		   	  if(!s.empty()&&s.top()<=v.back()){//先看小盒子 若不为空 且满足条件 
		   	  	 v.push_back(s.top()),s.pop();
				}
			  else{//否则就去传送带上寻找 
			  	 while(!q.empty()&&s.size()<=m){//若不空 且 小盒子没满 
			  	 	 int t=q.front();
			  	 	 if(t<=v.back()){
			  	 	   v.push_back(t);
					   q.pop();
					   break; 	
					}
					else{
						 if(s.size()==m){
					 	flag=1;//标记为满了 
					 	break;
					 }else{
					 	s.push(t);//否则放到小盒子中 
					 	q.pop();
					 }
					} 
				  } 
				   if(q.empty()&&(s.empty()||s.top()>v.back())) break;//传送带空了 小盒子还是不满足条件 空/栈顶大 
			  }
		   }
		   if(flag||v.size()==k) break;//盒子满了 松枝满了 
		} 
		for(int i=0;i<v.size();i++){
			if(i!=v.size()-1) cout<<v[i]<<' ';
			else cout<<v[i];
		} 
		cout<<endl;
		if(s.empty()&&q.empty()) break;//都是空的 退出大while 
	} 
	return 0;
}

主要还是模拟的思想 栈和队列只是最最最基本的操作

这俩就相互对应 while说的是传送带不空 且 小盒子没满 寻找满足的元素

之后的if说的是传送带空小盒子是空 或者 小盒子的栈顶不满足

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值