top1编程
← 返回题目
题解

【入门】双向队列

1 条题解

  • 0
    @ 2026-7-28 23:03:57
    #include<bits/stdc++.h>
    using namespace std;
    int a[10005],t=0; //a:存储出错的操作序号;t:记录错误个数
    int main( ){
    	deque<int>q; //双向队列
    	string s;    //s:存储每条操作的命令字符串(LIN/RIN/LOUT/ROUT)
    	int m,x;     //m:总操作次数;x:入队时的数字
    	cin>>m;      //读入操作总条数
    	for(int i=1;i<=m;i++){ //m个操作
    		cin>>s; //读取命令
    		if(s=="LIN"){//LIN X:从队头左侧入队
    			cin>>x;
    			q.push_front(x);//deque头插元素
    		}
    		else if(s=="RIN"){   //RIN X:从队尾右侧入队
    			cin>>x;
    			q.push_back(x); //deque尾插元素
    		}
    		else if(s=="LOUT"){ //LOUT:队头左侧出队
    			if(q.empty()==1){//队列空,无法出队→操作非法
    				a[t++]=i;  //把当前操作序号i存入错误数组a
    			}
    			else{
    				q.pop_front();//队列非空,正常弹出队首
    			}
    		}
    		else if(s=="ROUT"){ //ROUT:队尾右侧出队
    			if(q.empty()==1){//队列为空不能出队,非法操作
    				a[t++]=i;
    			}
    			else{
    				q.pop_back();//正常弹出队尾
    			}
    		}
    		else{ //既不是LIN/RIN/LOUT/ROUT,不合法
    			a[t++]=i;
    		}
    	}
    	// 最终队列从左到右所有元素
    	while(q.empty()!=1){
    		cout<<q.front()<<" "; //每次取队首输出
    		q.pop_front();        //输出后弹出队首
    	}
    	cout<<endl;
    	//错误数组,输出所有非法操作
    	for(int i=0;i<10000;i++){
    		if(a[i]!=0){ //非0代表存了错误编号
    			cout<<a[i]<<" "<<"ERROR"<<endl;
    		} 
    	}
    	return 0;
    }
    
    • 1