Java 8, 202 176 174 173 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("(\\D)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("(\\D)1x","$1x");} // and all occurrences of "1x" to "x"