30.模拟队列

描述:

思想:这里可以使用vector来保存队列中的元素,对于异或和,可以每一次push元素都和当前的和异或以下,然后pop的时候,再用出队列的这个元素和当前的和异或以下,两次相同元素的异或和为0,这样就可以正确记录当前存在与队列中的全部元素的异或和了。注意输入的数据在1~10^9,因此数据类型用long long的类型。

代码:

#include <bits/stdc++.h>
using namespace std;

class myque{
private:
    int begin;
    int end;
    vector<long long> que;
    long long sum;
public:
    myque(int b = 0,int e = 0,long long s = 0):begin(b),end(e),sum(s){
        que.resize(100000);
        // sum.resize(100000);
    }

    long long mypush(long long x){
        que[end++] = x;
        sum ^= x;
        return end - begin;
    }

    long long mypop(){
        if(begin == end){
            return -1;
        }
        sum ^= que[begin];
        return que[begin++];
    }

    long long myclear(){
        begin = 0; 
        end = 0;
        int tmp = sum;
        sum = 0;
        return tmp;
    }

};

int main() {
    int q;
    myque que;
    cin >> q;
    string str;
    getline(cin, str);
    while(q--){
        getline(cin, str);
        if(str.find("PUSH") != string::npos){
            int ind = str.find(" ");
            long long num = atoi(str.substr(ind+1).c_str());
            cout << que.mypush(num) << endl;
        }else if("POP" == str){
            cout << que.mypop() << endl;
        }else{
            cout << que.myclear() << endl;
        }
    }
    return 0;
}
posted @ 2024-09-14 21:07  alone_qing  阅读(6)  评论(0)    收藏  举报