Он объявляет оператор равенства между двумя stack
с функцией друга этого класса, который необходим для доступа к закрытым членам.
const stack<_Tp1, _Seq1>
появляется дважды, потому что есть 2 аргумента.
Конечно, это можно записать как
bool operator==(const stack<_Tp1, _Seq1>& y) const { return c == y.c; }
но стандарт C ++ (& sect; [stack.ops] (23.3.5.3.4)), похоже, требует, чтобы этот оператор был свободной функцией.