版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljxbbss/article/details/78127036
大话数据结构中,这一块其实对于初学的还是挺难的,我看了小半天,最后才转过弯来,
首先看图,图中箭头指明了思路,一开始我对链表的头部没想明白,后来想通了,就是每次压栈就相当于将元素放在链表头部,即栈顶指针元素相当于链表中的首节点;
因此每次插入一个,都需要将插入前的栈顶结点赋值给新节点的next结点属性;
每次弹栈,都需要将top的next指向元素置为top元素;
下面上代码:
class Node {
Node next;
Object element;
public Node(Node next, Object element) {
this.next = next;
this.element = element;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Object getElement() {
return element;
}
public void setElement(Object element) {
this.element = element;
}
}
public class LinkListStack {
int count;//当前栈内元素个数
Node top;//栈顶指针
int size;//栈大小
//初始化一个空栈
LinkListStack() {
top = null;
count = 0;
size = 10;
}
//构造一个指定大小的空栈
LinkListStack(int size) {
top = null;
count = 0;
this.size = size;
}
/**
* 采用这种方法代表这每插入一个元素,新的变成栈顶元素,同时每次都是链表的头结点
*
* @param element
* @return
*/
public boolean push(Object element) {
if (isFull()) {
return false;
}
//1.将插入前的栈顶元素变成新插入结点的next指针指向元素,2.新插入元素变成栈顶结点
top = new Node(top, element);
count++;
return false;
}
public Object pop() {
if (isEmpty()) {
System.out.println("栈为空");
return null;
}
Object element = top.getElement();
top = top.getNext();
count--;
return element;
}
public boolean isEmpty() {
return count == 0 ? true : false;
}
public int size() {
return count;
}
public Object peek() {
if(isEmpty()){
return null;
}
return top.getElement();
}
public boolean isFull() {
return this.count == this.size ? true : false;
}
public static void main(String[] args) {
LinkListStack stack = new LinkListStack();
stack.push("元素1");
stack.push("元素2");
System.out.println(stack.peek());
stack.pop();
System.out.println(stack.peek()+";"+stack.count);
}
}
记录走过的历程。