I need help implementing a Stack with this java programming assignment: Given a doubly linked list (code provided below) implement a Stack. You must use the doubly link list class and utilize it as an object in your implementation of the stack. A Stack is a Last in First Out (LiFO) structure which translates to the processes of outputting the last element which was inputted in the collection. The Stack is based on the process of putting things on top of one another and taking the item on top (think of a stack of papers). Operations to implement: push (E): Add an element to the start of the sequence pop: Remove an element from the start of the sequence Peek: Return the first element of the sequence without removing it atIndex(x): Return the element at the given index (x) Or throw an exception if it is out of bound (if you can control the user input then do that instead) Size: Return the size of the Stack isEmpty: Boolean, returns true if the Stack is empty Empty: Empty the Stack Code Part 1: public class DoublyLinkedList{ private DNode head; private DNode tail; private int size; public DoublyLinkedList(){ // construct an empty list this.tail = new DNode (null, null, this.head); this.head = new DNode (null, this.tail, null); this.size = 0; } public DoublyLinkedList(DNode next){ // constructs a list // out of a single node this.tail = new DNode (null, null, next); this.head = new DNode (null, next, null); next.changeNext(this.tail); next.changePrev(this.head); this.size = 1; } public DoublyLinkedList(Object [] objectArray){ // construct a list out of // an array this.tail = new DNode (null, null, this.head); this.head = new DNode (null, this.tail, null); DNode temp = this.head; for (Object e : objectArray) { //Anonomus function new DNode (e, temp.getNext(),temp).insertBetweenNodes(temp, temp.getNext()); temp = temp.getNext(); this.size += 1; } } public void addToFrontofList(Object toAdd){ // Appends the begining // of the list DNode temp = new DNode (toAdd, this.head.getNext(), this.head); this.head.getNext().changePrev(temp); this.head.changeNext(temp); this.size += 1; } public void addToendofList (Object toAdd) // appends the end of the list // with a node { DNode temp = new DNode (toAdd, this.tail, this.tail.getPrev()); this.tail.getPrev().changeNext(temp); this.tail.changePrev(temp); this.size += 1; } public void insertAfterNode(DNode current, Object input)// Inserts a new // a new node after // current node { current.insertAfterNode(input); this.size += 1; } public int getSize() // returns the size of the list { return this.size; } public String toString() { String result = \"\"; for (DNode temp = this.head.getNext(); temp.hasNext(); temp = temp.getNext()) { result += temp.getValue(); result += \" -> \"; } result += \"End of list\"; return result; } } and code part2: public class DNode{ private Object e; // place holder for the type of object the //collection is storing private DNode next; // reference to the next node in the sequence // of.