Hello Vincent
First of all, I'm sorry to be late, but I've moved from Europe to LatinAmerica to help in a out-of-date large scale project and I'm *VERY* busy.
Also, I'm very pleased to had been helpful to you, and I'll try to answer all your questions.
"Pre/Post conditions, invariants, and such things" are the foundations for all "design by contract" techniques. In real world, large scale systems, this is the *MOST* important thing in an IT system.
Let's say, as an example, we owns four development teams composed by 40 developers each one. Sure there will be a number of firms involved in this system, and little (or big) wars about who will develop next project step (and who will earn money for this job!) so code written by one developer will likely be modified by another developer in another city (or country) working for another firm. It's also very common that a system which was designed to do one work, was implemented to do a little different work (because a law was changed, a user changed his oppinion about some question, etc) and later was modified again. This use to produce 'trash code' or 'spaguetti code'. Spaguetti code is very expensive to modify because its very complex and too many people had been involved in different versions, so there is no one who owns all knowledge about one piece of software.
Think in a class implemented by an asian developer two years ago which is invoked by another class written by a brasilian developer a few weeks ago.
Well, You can be *SURE* that in such a hell-on-earth (but very common) scenario, if there were asserts implementing pre/post conditions, invariants, and meaningful remmarks in code, life will be easier. (and cheaper!!! you cannot imagine what amount of money is wasted around the world in maintaining bad designed/bad implemented/bad evolved IT systems)
O.K. I hope you have understand why this kind of things are importants.
From a math-point-of-view, it can be used to assure that one algorithm is finite and do exactly one work using various esoteric math processes but are not used in real world.
About Data Structures(DS), I have to say that you must know what are the existing DS's, how are internally organized and the advantages/disadvantages of each one in order to make the rigth decission at every particular situation. Also it will be very useful for you to write three or four classes implementing different DS's to really know them. I encorageus you to write a balanced tree, a priority LIFO, a hash map and a heap at least.
Well, I hope all this words will be helpful!
Best Regards.
Polu.