This can be done by advising the function that sets the clipboard.
;; Clipboard history.
(defvar my-clipboard-history-limit 10)
(defvar my-clipboard-history--list nil)
(defun my-clipboard-history-paste (&optional index)
(insert (nth (or index 0) my-clipboard-history--list)))
(defun my-clipboard-history-paste-penultimate ()
You're in luck; this is already built in. C-y yanks the last thing that you've killed or copied, and M-y replaces it with the next item from the kill-ring, which contains everything you've killed or copied in your current Emacs session.