As nv3 pointed out in Solution 1, using the same class for the stack and for the items you are managing is leading to confusion.
If your objective is
just to implement a stack (LIFO queue), then a doubly-linked list is
more complexity than you want.
A stack can be implemented with a singly linked list.
To debug your algorithm (not the
code, the
algorithm; if this isn't correct, the code will
never be correct) I'd take a pencil and paper and walk through the steps of pushing 3 items onto the stack: draw boxes to represent the stack nodes and arrows to represent the pointers. Erase and redraw the pointers as they change. Is the stack state correct? If so, now pop off all of the 3 items, one at a time, and again move the arrows (pointers) and verify that everything behaves correctly, especially in the case of popping off the last item (because that's where you currently are having trouble).
If that all works, then work on the code.
I'd suggest different classes for the stack, the nodes referencing/holding the data and the data (items) themselves.
Pseudo-code for singly-linked stack:
node has {item* head; node* tail;} // both initialize to null (for historical relevance these would have been named car and cdr!)
stack has {node* top}
stack theStack; // empty stack
void stack::push (item*):
node* cons = new node() // name chosen for historical relevance
cons->head = item
cons->tail = this.top
this.top = cons
item* stack::pop()
if this.top == null then report pop from empty stack and return null
node* tos = this.top
item* result = tos->head
this.top = tos->tail
delete tos
return result