Pose is the x,y,z position and quaternion orientation of the robot, a rosmsg show Pose
reveals:
[geometry_msgs/Pose]:
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
While PoseStamped is simply a Pose message with the standard ROS header:
[geometry_msgs/PoseStamped]:
Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
I think it depends on which stack you are using for which message is used, and I believe that PoseStamped is largely preferred because it includes the coordinate frame_id of the given Pose, as well as the time stamp that that Pose is valid.
On the other hand, if you don't need time information (say you are storing a time-independant Path), you could use an array of Poses, which would not need the additional header information.