这道题我是三明治和学生都用了队列,并不像原题那样三明治是栈。

本来我也无比天真,按着题目的说法让三明治为栈,但这就是出题人的阴险之处,我们会发现样例是可以顺利通过的,结果在实际提交时就出错了。思索片刻,我才恍然大悟,三明治序列的样例别有用心的设计为对称性的数据,这意味着无论你是顺序还是逆序入栈,整个栈都是一样的,但是如果换成是10010非对称序列,那么当你程序运行时,三明治弹出的栈顶元素反而是三明治序列从后往前的元素,这和题目的逻辑(从前往后弹出三明治序列的元素)正好相反。

所以,这也是个经验,当设计一个栈并且要将序列的元素压入栈时,一定一定要记得栈的数据排列和序列的排列顺序正好是相反的!而队列的排列顺序才是和序列排列顺序一致。

#include <queue>
#include <stack>
class Solution {
public:
    int countStudents(vector<int>& students, vector<int>& sandwiches) {
        queue<int>sand;//演都不演了,直接定义三明治也为队列结构,保持和三明治原序列相同的数据排列顺序
        queue<int>stu;
        int cnt1=0, cnt0=0, summ=0;
        for (int & student : students) {// &意味着指针,改变student就能直接改变students数组的元素值。而不加&则是从students里的当前元素拷贝一份出来,并不改变students里的元素,性能低
            stu.push(student);
            if (student == 1) {
                cnt1++;
            }
            else {//student == 0
                cnt0++;
            }
            summ++;
        }
        for(int &sandwich : sandwiches){
            sand.push(sandwich);
        }

        while ( !( (cnt0 == 0 && sand.front() == 0) || (cnt1 == 0 && sand.front() == 1) ) ) {
            if (sand.front() == stu.front()) {
                if (stu.front() == 1) cnt1--;
                else cnt0--;
                summ--;
                stu.pop();
                sand.pop();
            }
            else {
                int temp = stu.front();
                stu.pop();
                stu.push(temp);
            }
        }
        return summ;
    }
};