Hola, si necesitaras la pila despues de modificar los valores, te recomendaria utilizar una pila auxiliar, aca te dejo un pseudo:
Pila p1 = LlenarAleatoriamente()
Pila pAux
While p1 no es vacia
x = p1.Pop()
If x es 2
x = 0
pAux.Push(x)
While pAux no es vacia
p1.Push(pAux.Pop())
En C# seria algo como:
Stack
<int> p1
= new Stack
<int>();Stack
<int> pAux
= new Stack
<int>();while(p1.Count != 0){
int item = p1.Pop();
pAux.Push(item == 2? 0 : item);
}
// Para voltear la pila aux en la pila de origen
while(pAux.Count != 0)
p1.Push(pAux.Pop());
Saludos