Both mean that a person is relunctant to spend money. Stingy is more commonly used as an insult. Cheap is also a slightly negative word, but it's one that people would be more likely to use to describe themselves. ("I can't go; I'm so cheap.") It's also the word that people would use to make fun of someone in a joking way (between friends, "Oh come on, don't be so cheap!")
"Frugal" is a positive way to say it. If you admire someone's caution with money, you would say they're very frugal.
Be careful when you use cheap because it can also mean someone who doesn't value herself when it comes to sex (like "Don't go out in that dress - it makes you look so cheap.")