Almost all the time when I have to enter address information I enter name (typing), address (typing), city (typing), zip (typing), and state (popup menu??!!).
If a person can be trusted to type in all the other info, one would think they could be trusted to type in a two-character state abbreviation. After all, it’s easy enough to validate.
In my apps, I take them to the zip code field first. If they enter a valid zip, I populate the city and state. In the rare instance where there are more than one city in the zip code, they can manually change the city. I also provide a popup window on the zip where they can enter a new one, if needed. 99% of the time, the zip code is all the data entry required.