栈
定义:
栈(Stack)是一个后进先出(Last in first out,LIFO)的线性表,它要求只在表尾进行删除和插入操作。
图如下:
特点:
一、栈特殊的线性表(顺序表、链表),它在操作上有一些特殊的要求和限制:栈的元素必须“后进先出”。
三、栈的表尾称为栈的栈顶(top),相应的表头称为栈底(bottom)
二、栈的操作只能在这个线性表的表尾进行。
顺序栈的实现:
push()、pop()、peek()方法的时间复杂度为O(1),当需要扩充栈容量时push()方法的时间复杂度为O(n)
package com.ds.stack; import java.util.Arrays; public class Stack<T> { // Java数组实现,可以使用java泛型数组。如需使用,请使用Java提供的容器 private Object[] stack; // 栈的默认初始大小 private final static int INIT_SIZE = 2; // 栈顶索引 private int index; /** * 默认构造方法 * * 栈的初始大小 默认 */ public Stack() { this.stack = new Object[INIT_SIZE]; index = -1; } /** * 构造方法 * * @param initSize * 栈的初始大小 */ public Stack(int initSize) { if (initSize < 0) throw new IllegalArgumentException(); this.stack = new Object[initSize]; index = -1; } /** * 出栈操作 * * @return 栈顶对象 */ public synchronized T pop() { //return this.top == -1 ? null :(T)this.element[this.top--]; if (!isEmpty()) { T temp = peek(); stack[index--] = null; return temp; } return null; } /** * 出栈操作 * * @return 栈顶对象 */ public synchronized void push(T item) { if (isFull()) { // 如果栈满,则创建空间为当前栈空间两倍的栈 Object[] temp = stack; temp = new Object[2 * stack.length]; stack = Arrays.copyOf(temp, temp.length); } stack[++index] = item; } /** * 查看栈顶对象 * * @return 栈顶对象 */ public T peek() { //return this.top == -1 ? null : (T)this.element[this.top]; if (!isEmpty()) { return (T) stack[index]; } return null; } /** * 查看栈是否为空 * * @return 如果栈为空返回true,否则返回false */ public boolean isEmpty() { return index == -1; } /** * 查看栈是否满 * * @return 如果栈满返回true,否则返回false */ public boolean isFull() { return index == stack.length - 1; } public static void main(String[] args) { Stack<Integer> stack = new Stack<Integer>(3); for (int i = 0; i < 5; i++) { stack.push(i); } System.out.println("stack.top : " + stack.peek()); } }
如果存在问题,我们随时交流!