是重要的数据结构,从数据结构角度看,栈也是线性表,其特殊性在栈的基本操作是线性表的子集。Stack作为最基本的数据结构,在JDK代码中,也有它的实现,java.util.Stack类是继承了Vector类,来实现了栈的基本功能。 

一、栈的基本原理 

栈(Stack)是限定仅在表尾进行插入或者删除操作的线性表。因此,对于栈来说,表尾端有特殊含义,成为栈顶,表头称之为栈底。

由下图可以看出,栈的最基本的特征是LIFO(Last In First Out),因此栈又被称为后进先出 的线性表。

二、栈的基本操作

InitStack(&S)--------------构造一个空栈
 IsEmpty:判断栈是否为空
 ClearStack:清空栈
 StackLength:栈S的元素个数,即栈的长度
 GetTop:获取栈顶元素
 Push:插入新的元素
 Pop:删除栈顶元素

三、栈的使用

JDK给我们提供了栈的默认实现,在java.util包中的Stack类

public class Stack<E>    
    extends    
    Vector<E>

Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的search

首次创建堆栈时,它不包含项。

Deque 接口及其实现提供了 LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非此类。例如:

Deque<Integer> stack = new ArrayDeque<Integer>();

示例代码

package com.yulore.ex;

import java.util.Stack;

public class StackTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		Stack<Integer> stack = new Stack<Integer>();

		for (int i = 0; i < 5; i++) {
			stack.push(i);
		}
		
		System.out.println("isEmpty:"+stack.isEmpty());
		System.out.println("capacity:"+stack.capacity());
		System.out.println("peek:"+stack.peek());

		System.out.println("*********遍历操作**********");
		
		// 集合遍历方式
		for (Integer x : stack) {
			System.out.println(x);
		}
		System.out.println("--------------------------");
		// 栈弹出遍历方式
		// while (s.peek()!=null) { //不健壮的判断方式,容易抛异常,正确写法是下面的
		while (!stack.empty()) {
			System.out.println(stack.pop());
		}
		
	}
}

Stack利用Vector动态数组实现了后进先出的栈的基本功能,但是数组有下列缺陷:

1)当数组默认的容量发生改变时,push的性能会有较大降低

四、自定义栈

数组的缺点是,当数组长度发生变化时,原有的元素需要经过copy到新的数组中,这样性能有较大的损耗,而链表最大的优点是插入和删除的性能非常好,Java提供了现成的双向链表类java.util.LinkedList,通过它可以快速编写自己的Stack程序。

代码

package com.yulore.ex;

import java.util.LinkedList;

public class Stack<E> {
	LinkedList<E> list;
	
	public Stack(){
        list = new LinkedList();
    }
    
    public E pop(){
        return list.removeLast();
    }
    
    public void push(E o){
        list.add(o);
    }
    
    public E getTop(){
        return list.getLast();
    }
    
    public boolean isEmpty(){
        return list.size()==0;
    }
    
    public int size(){
        return list.size();
    }
}