#Java 8, 202 176 174 bytes
a->{String r="";int j=a.length;for(int i:a)r+=i==0*j--?"":"+"+i+(j<1?"":j<2?"x":"x^"+j);return r.isEmpty()?"0":r.substring(1).replace("+-","-").replaceAll("([+-])1x","$1x");}
- 26 bytes thanks to @Nevay.
Explanation:
a->{ // Method with String-array parameter and String return-type
String r=""; // Result-String, starting empty
int j=a.length; // Power-integer, starting at the size of the input-array
for(int i:a) // Loop over the array
r+=i==0 // If the current item is 0
*j--? // (And decrease `j` by 1 at the same time)
"" // Append the result with nothing
: // Else:
"+" // Append the result with a "+",
+i // and the current item,
+(j<1? // +If `j` is 0:
"" // Append nothing more
:j<2? // Else-if `j` is 1:
"x" // Append "x"
: // Else:
"x^"+j); // Append "x^" and `j`
return r.isEmpty()? // If `r` is still empty
"0" // Return "0"
: // Else:
r.substring(1) // Return the result minus the leading "+",
.replace("+-","-") // and change all occurrences of "+-" to "-",
.replaceAll("([+-])1x","$1x");}
// and all occurrences of "1x" to "x"