定义:

   栈(Stack)是一个后进先出(Last in first out,LIFO)的线性表,它要求只在表尾进行删除和插入操作。

    图如下:

【Java数据结构】3.1 顺序栈_java数据结构

特点:

   一、栈特殊的线性表(顺序表、链表),它在操作上有一些特殊的要求和限制:栈的元素必须“后进先出”。

   三、栈的表尾称为栈的栈顶(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());
    }
}


如果存在问题,我们随时交流!