Implement stack structure with linked list

The singly linked list is used as the bottom layer to realize the data structure of the stack

Implementation of the stack:

package SingleLinkedListStack;
import ArrayStack.Stack;
import SingleLinkedList.Node;
import SingleLinkedList.SingleLinkedList;

/*
 * 用链表作为栈的底层
 */
public class SingleLinkedListStack <E> implements Stack<E>{
    
    
//  用链表作为栈的底层
	public SingleLinkedList<E> list;
	public SingleLinkedListStack() {
    
    
	             list = new SingleLinkedList();
}
	@Override
	public void push(E e) {
    
    
		// TODO Auto-generated method stub
		list.addFirst(e);
	}

	@Override
	public E pop() {
    
    
		// TODO Auto-generated method stub
		return (E) list.removeFirst();
	}

	@Override
	public E peek() {
    
    
		// TODO Auto-generated method stub
		return  list.getfirst();
	}

	@Override
	public int getSize() {
    
    
		// TODO Auto-generated method stub
		return list.getSize();
	}

	@Override
	public boolean isEmpty() {
    
    
		// TODO Auto-generated method stub
		return list.isEmpty();
	}
	@Override
	public String toString() {
    
    
		
		  StringBuilder sb=new StringBuilder(); sb.append("stack ");
		  sb.append("push:>");
		  for(int i=0;i<list.getSize();i++) {
    
    
			  sb.append(list.get(i));
			  sb.append("->");
		  }
		  sb.append("null");
		return sb.toString();
	}
	
}

Stack test:

package SingleLinkedListStack;

public class SingleLinkedListStackTest {
    
    
public static void main(String[] args) {
    
    
	SingleLinkedListStack st =new SingleLinkedListStack<Integer>();
	for(int i=1;i<6;i++) {
    
    
		st.push(i);
	}
	System.out.println(st);
	for(int i=0;i<3;i++) {
    
    
		st.pop();
	}
	System.out.println(st);
	System.out.println(st.peek());
	System.out.println(st.getSize());
	System.out.println(st.isEmpty());
}
}

Test result:
Insert picture description here
Comparison of the time complexity of using an array to implement a stack and using a linked list to implement a stack:
Implementing a stack using an array: Implementing a stack
Insert picture description here
using a linked list
Insert picture description here

The additional implementation linked list code is as follows:

package SingleLinkedList;
/*
 * 单链表的实现
 */
public class SingleLinkedList<E> {
    
    
  private Node nullhead;  //声明空头节点
  private int size; // 链表存放的元素
  public SingleLinkedList() {
    
    
	  nullhead =new Node(null,null);
	  size=0;
  }
//  在链表头位置添加元素
  public void addFirst(E e){
    
    
     add(0,e);	
  }
  public void addLast(E e) {
    
    
	 add(size,e);
  }
  //在任意位置添加元素
  public void add(int index, E e) {
    
    
	// TODO Auto-generated method stub
	if(index<0||index>size) {
    
    
		throw new IllegalArgumentException("add failed,index is invaild");
		
	}
	Node prev =nullhead;
	for(int i=0;i<index;i++) {
    
    
		prev =prev.next;
	}
//  创建一个待插入的节点node
	Node node =new Node(e);
//  将该节点挂接到链表中(要注意顺序,先连尾部先)
//	node.next=prev.next;
//	prev.next=node;
	prev.next =new Node(e,prev.next); //等同于上面两行代码,比较简洁
//   维护size
	size++; 
}
 // 删除元素首个
  public Object removeFirst() {
    
    
	  return remove(0);
  }
  public E removerLast() {
    
    
	  return remove(size-1);
  }
  public E remove(int index) {
    
    
	// TODO Auto-generated method stub
	if(index<0||index>=size) {
    
    
		throw new IllegalArgumentException("remove failed,index is invaild");
	}
	Node prev =nullhead; //
//  通过这个for循环,找到待删除的节点的前一个节点
	for(int i=0;i<index;i++) {
    
    
		prev=prev.next;
	}
    Node delnode =prev.next;//待删除的节点
    prev.next =delnode.next; //开始连接
    delnode.next=null; //断开连接
    size--;
	return (E) delnode.e;
}
  
   public void set(int index,E e) {
    
    
	   if(index<0||index>=size) {
    
    
		   throw new IllegalArgumentException("set failed ,index is invaild");
	   }
//   先拿到头节点,以便遍历
	   Node cur =nullhead.next;
	   int i=0;
	   while(cur!=null) {
    
    
		      if(i==index) {
    
    
		    	  cur.e=e;
		      }
		      i++;
		     cur= cur.next;
	   }
   }
   public E get(int index) {
    
    
	  if(index<0||index>=size) {
    
    
		  throw new IllegalArgumentException("get failed ,index is invaild");
	  }
	  Node cur =nullhead.next;
	  int i=0;
	  while(cur!=null) {
    
    
		    if(i==index) {
    
    
		    	return (E) cur.e;
		    }
		    i++;
		    cur=cur.next;
	  }
	   
	return null;
   }
   public E getfirst() {
    
    
	   return  get(0);
   }
   public boolean isEmpty() {
    
    
	   return size==0;
   }
   public int getSize() {
    
    
	   return size;
   }
//重写打印输出
public String toString() {
    
    
    StringBuilder res=new StringBuilder();
    res.append("linkedList:");
    Node cur =nullhead.next;//第一个节点,也就是头节点
    while(cur!=null) {
    
    
    	res.append(cur+"->");
    	cur=cur.next;
    }
    res.append("null");
	return res.toString();
}
}

package SingleLinkedList;
/*
 * 但链表表节点的封装
 * 一个Node节点包含的数据是元素和下一个节点的连接
 */
public class Node <E>{
    
    
	public E e;
	public Node next;
	public Node(E e, Node next) {
    
    
		this.e = e;
		this.next = next;
	}
	public Node(E e) {
    
    
		this(e, null);
	}
	public Node() {
    
    
		this(null, null);
	}
	@Override
	public String toString() {
    
    
	  return e.toString();
	}

}

Guess you like

Origin blog.csdn.net/weixin_45952706/article/details/109235614