There are various contour extraction algorithms in QGIS, for example:
Below is an example of contours created without and with sink removal. The contours on the right have been derived from a DEM where the sinks (in yellow on the left) have been filled.
It is worth noting that a depressionless DEM does not guarantee that there will be no contour sinks. A deep diagonal channel combined with a small contour interval can still cause sinks.
See GIS Stack Exchange for options of how to deal with this.
Vectors can be compressed by using something like:
A tolerance of 1(m) seems reasonable for 1:25000 mapping. Smaller tolerances may be appropriate for larger scale maps (eg 1:10000, 1:5000).
For more options in compression, look at:
V.generalize can also be used to smooth contours - possibly best done prior to simplificiation
Once simplified, it is worth removing small closed loops, such as those in the image below.
Here is one approach, which involves adding a length attribute to each contour, and removing those that fall below a certain length. It may cause issues if you have short sections of contour near the edge of the map that you need. However, that shouldn't be a problem in most scenarios.
See separate page on QGIS Contour Labelling