什么是栈?

栈(stack)是个有序线性表,只能在表的一端(称为栈顶,top)执行插入和删除操作。最后插入的数据将最先删除。所以,栈也称为后进先出(Last In First Out, LIFO)或先进后出(First In Last Out, FILO)线性表。

入栈和出栈

栈的应用

  • 符号匹配
  • 中缀表达式转换为后缀表达式
  • 计算后缀表达式
  • 实现函数的调用(包括递归)
  • 网页浏览器中已访问页面的历史记录(后退按钮)
  • 文本编辑器中的撤销
  • HTML和XML文件中的标签匹配

栈的实现

1.基于简单数组的实现方法

public class ArrayStack {
	private int top;
	private int capacity;
	private int[] array;

	public ArrayStack() {
		capacity = 1;
		array = new int[capacity];
		top = -1;
	}

	public boolean isEmpty() {
		return top == -1;
	}

	public boolean isFull() {
		return top == capacity - 1; // 或者 top == array.length
	}

	public void push(int data) {
		if (isFull()) {
			System.out.println("Stack Overflow");
		} else {
			array[++top] = data;
		}
	}

	public int pop() {
		if (isEmpty()) {
			System.out.println("Stack is Empty");
			return 0;
		} else {
			return array[top--];
		}
	}

	public void delete() {
		top = -1;
	}
}

2.基于动态数组的实现方法

方法1实现的栈最大空间必须先声明且不能改变,所以可以jy,新建一个比原数组空间大一倍的新数组,然后复制元素到新的数组中。

public class DynArrayStack {
	private int top;
	private int capacity;
	private int[] array;

	public DynArrayStack() {
		capacity = 1;
		array = new int[capacity];
		top = -1;
	}

	public boolean isEmpty() {
		return top == -1;
	}

	public boolean isFull() {
		return top == capacity - 1; // 或者 top == array.length
	}

	public void doubleStack() {
		int newArray[] = new int[capacity * 2];
		System.arraycopy(array, 0, newArray, 0, capacity);
		capacity = capacity * 2;
		array = newArray;
	}

	public void push(int data) {
		if (isFull()) {
			doubleStack();
		}
		array[++top] = data;
	}

	public int pop() {
		if (isEmpty()) {
			throw new EmptyStackException();
		} else {
			return array[top--];
		}
	}

	public void delete() {
		top = -1;
	}
}

3.基于链表的实现方法

使用链表实现栈。通过在链表的表头插入元素的方式实现push操作,删除链表表头实现pop操作


public class LLStack {
	private LLNode headNode;

	public LLStack() {
		this.headNode = new LLNode(null);
	}

	public boolean isEmpty() {
		return headNode == null;
	}

	public void push(int data) {
		if (headNode == null) {
			headNode = new LLNode(data);
		} else if (headNode.getData() == null) {
			headNode.setData(data);
		} else {
			LLNode node = new LLNode(data);
			node.setNext(headNode);
			headNode = node;
		}
	}

	public int pop() {
		if (headNode == null) {
			throw new EmptyStackException();
		} else {
			int data = headNode.getData();
			headNode = headNode.getNext();
			return data;
		}
	}

	public void delete() {
		headNode = null;
	}
}
posted @ 2018-08-01 22:13  sane33  阅读(111)  评论(0编辑  收藏  举报