A terminal shows text and passes your keystrokes along, while a shell is the command-line interpreter that reads them as commands and runs them. The terminal never works out what ls means.
The shell does that work. It expands variables and wildcards, then starts the programs you asked for. It also manages environment variables and job control.
The two are independent. One terminal can host any shell, and a shell needs no terminal when cron runs a script with it. Common shells include Bash and Zsh. Fish and Dash are two more. Today's terminals are terminal emulators, software versions of the hardware terminals early Unix machines used.
Rewriting in plainer words…
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.