栈也是一种线性表,栈底层实现仍然是链表或者顺序表,对数据的处理是队列中的一端
栈的方法:取头结点,入栈,出栈,判断是否为空
public class MainTest { public static void main(String[] args) { Stack<Integer> stack = new Stack(); stack.push(1); stack.push(2); stack.push(3); System.out.println("栈顶元素为:" + stack.peek()); while (!stack.empty()) { //只显示没出栈 System.out.println(stack.peek()); //出栈并且显示 System.out.println(stack.pop()); } } }
用数组模拟栈
思路:确定一个栈顶(是直接取空值还是直接取顶部元素),数组,扩容,方法
class Mystack<T> { //实现栈的数组 private Object[] stack; //栈顶元素 private int top; Mystack() { //初始容量为10(类似与一个arrylist) stack = new Object[10]; } //判断是否为空 public boolean isEmpty() { return top == 0; } //返回栈顶元素 public T peek() { T t = null; if (top > 0) t = (T) stack[top - 1]; return t; } public void push(T t) { expandCapacity(top + 1); stack[top] = t; top++; } //出栈 public T pop() { T t = peek(); if (top > 0) { stack[top - 1] = null; top--; } return t; } //扩大容量 public void expandCapacity(int size) { int len = stack.length; if (size > len) { size = size * 3 / 2 + 1;//每次扩大50% stack = Arrays.copyOf(stack, size); } } }
链表模拟栈:直接将头结点变成栈顶
class ListStack<T> { //定义链表 class Node<T> { public T t; public Node next; } public Node<T> head; //构造函数初始化头指针 ListStack() { head = null; } //入栈 public void push(T t) { if (t == null) { throw new NullPointerException("参数不能为空"); } if (head == null) { head = new Node<T>(); head.t = t; head.next = null; } else { Node<T> temp = head; head = new Node<>(); head.t = t; head.next = temp; } } //出栈 public T pop() { if (head == null) { return null; } T t = head.t; head = head.next; return t; } //取栈顶元素 public T peek() { if (head == null) { return null; } T t = head.t; return t; } //栈空 public boolean isEmpty() { if (head == null) return true; else return false; } }