As you may have guessed, there will be a great deal more work involved if you are used to C++ and want to change to C.
For your vectors, the usual approach is to use linked lists when you want a dynamic array-like structure. Though this is not the same as a vector - O(1) access here vs O(n) in a regular linked list - it usually "does the job". Alternatively: don't use a dynamic array. Lots of situations can get by with a fixed array and a MAX_ARRAY-style constant. For v0.2 at least :-)
For strings, you will probably end up with something like:
struct string {
char *buf;
size_t length;
}
With more fields to account for the buffer allocated vs the actual buffer used, and so on. Then a whole raft of routines to append to the string, free it, copy another string, and so on.
Stacks can be implemented in terms of a linked list or an array.
Have you spotted the pattern? Computer Science 101. Plenty of wheel reinvention. The advantage is that you can optimize the data structures for your program. The disadvantages are that you will have to write a whole bunch of code just to get back to where you are now, probably. And you're going to need a lot more unit tests.