Replace by most recent nonzero Given a non-empty list of decimal digits (0, 1, ..., 9), replace each zero by the most recent nonzero, if possible.

Example 1: given

1 4 3 0 0 7 5 5 0 3


the output should be  

1 4 3 3 3 7 5 5 5 3


Note how the first two zeros are replaced by 3, which is the most recent (i.e. rightmost) nonzero. Similarly, the last zero is replaced by 5.

Example 2: given

0 0 4 0 0 5 0


the output should be

0 0 4 4 4 5 5


Note how it is not possible to replace the first two zeros, because there isn't a nonzero number to the left ot them.

Additional rules


Input can be taken by any reasonable means. Format is flexible as usual. In particular, it can be a list of numbers, an array, a string representation of an array, a string of digit characters ...
Programs or functions are allowed, in any programming language. Standard loopholes are forbidden.
Shortest code in bytes wins.


Test cases

Input, then output

1 4 3 0 0 7 5 5 0 3
1 4 3 3 3 7 5 5 5 3

0 0 4 0 0 5 0
0 0 4 4 4 5 5

0 0 0
0 0 0

0
0

0 1
0 1

4 2 1 0
4 2 1 1

8 0 0 0 6
8 8 8 8 6
JavaScript (ES6),  22  21 bytes

A=&gt;A.map(x=&gt;A=x||~~A)

Try it online!
Commented
A =&gt;          // A[] = input array
  A.map(x =&gt;  // for each value x in A[]:
    A =       //   update A to:
      x ||    //     either x, if it's not equal to 0
      ~~A     //     or A coerced to an integer otherwise
  )           // end of map()

Because we're re-using the input array \$A[\:]\$ to store the last non-zero value, two special cases arise if the 2nd part of the condition is executed on the 1st iteration:

if \$A[\:]\$ is a singleton array containing \$0\$, ~~A is equal to ~~0
if \$A[\:]\$ is an array of several elements (starting with \$0\$), ~~A is equal to ~~NaN

which gives the expected \$0\$ in both cases.