赞
踩
栈的概念
后进先出法
简 称 LIFO
栈是一种只允许在一端进行插入或删除的线性表。
1、栈的操作端通常被称为栈顶,另一端被称为栈底。
2、栈的插入操作称为进栈(压栈|push);栈删除操作称为出栈(弹栈|pop)。特点
栈就像一个杯子,我们只能从杯口放和取,所以栈中的元素是“先进后出”的特点。
存储结构
顺序存储的栈称为顺序栈;链式存储的栈称为链式栈。
java实现
我们可以围绕栈的4个元素来实现栈:
2状态:是否栈空;是否栈满。
2操作:压栈push;进栈pop。
顺序栈的实现
顺序栈示意图:
代码实现
package LinearTable.Stack; import java.util.Arrays; /** * 数组实现栈 * @param <T> */ class Mystack1<T> { //实现栈的数组 private Object[] stack; //数组大小 private int size; //初始化数组 Mystack1() { stack = new Object[10];//初始容量为10 } //判断是否为空 public boolean isEmpty() { return size == 0; } //返回栈顶元素 public T peek() { T t = null; if (size > 0) t = (T) stack[size - 1]; return t; } //入栈 public void push(T t) { expandCapacity(size + 1); stack[size] = t; size++; } //出栈 public T pop() { //移到栈顶,准备出栈 T t = peek(); if (size > 0) { stack[size - 1] = null; size--; } return t; } //如果栈满了就需要扩大容量 public void expandCapacity(int size) { int len = stack.length; if (size > len) { size = size * 2;//每次扩大一倍 //Java里面数组扩大的方法Arrays.copyOf() stack = Arrays.copyOf(stack, size); } } } public class ArrayStack { public static void main(String[] args) { Mystack1<String> stack = new Mystack1<>(); System.out.println(stack.peek()); System.out.println(stack.isEmpty()); stack.push("java"); stack.push("is"); stack.push("beautiful"); stack.push("language"); System.out.println(stack.pop()); System.out.println(stack.isEmpty()); System.out.println(stack.peek()); } }
链式栈的实现
链式栈示意图:
代码实现
package LinearTable.Stack; /** * 链表实现栈 * * @param <T> */ class Mystack2<T> { //定义链表 class Node<T> { //定义数据类型泛型T private T t; //定义指针 private Node next; } //定义头节点 private Node<T> head; //构造函数初始化头指针 Mystack2() { head = null; } //入栈 public void push(T t) { if (t == null) { throw new NullPointerException("参数不能为空"); } if (head == null) { //创造的新节点 head = new Node<T>(); head.t = t; //next指针指向下一个位置 head.next = null; } else { //头节点指向的位置 Node<T> temp = head; //创建新节点 head = new Node<>(); head.t = t; head.next = temp; } } //出栈 public T pop() { T t = head.t; head = head.next; return t; } //栈顶元素 public T peek() { T t = head.t; return t; } //栈空 public boolean isEmpty() { if (head == null) return true; else return false; } } public class LinkStack { public static void main(String[] args) { Mystack2 stack = new Mystack2(); System.out.println(stack.isEmpty()); stack.push("Java"); stack.push("is"); stack.push("beautiful"); System.out.println(stack.peek()); System.out.println(stack.peek()); System.out.println(stack.pop()); System.out.println(stack.pop()); System.out.println(stack.isEmpty()); System.out.println(stack.pop()); System.out.println(stack.isEmpty()); } }需要小伙伴们自己多看几遍理清链表运行的逻辑思路
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。