【数据结构】动态数组实现栈及基本应用

栈是一种后进先出的线性数据结构,相对于数组,栈对应的操作是数组的子集,只能从一端添加元素,也只能从该端取出元素,这一端称为栈顶。

①无处不在的Undo操作(撤销)

我们在编辑器中打字时,一旦输入错别字,我们可以使用快捷键Ctrl+Z进行撤销操作,即从栈中取出刚刚输入的错别字,这个是栈中的一个基本应用。

②系统调用的系统栈

在我们编程进行子过程调用(递归)的过程中,当一个子过程执行完成之后,可以自动回到上一层调用中断的位置,继续执行下去,其背后的原因就是系统栈会记录每次调用过程中中断的点。

③括号匹配

遍历,将左括号放入栈中,遇到右括号就与栈顶括号比较,若匹配成功则将栈顶括号出栈且继续遍历下一个括号;若匹配失败,则马上可以得出这串括号是不能匹配成功的;若在最后全部遍历结束且栈为空,则说明全部括号可以一一匹配成功。

	public static boolean mate(String str) {
		Stack<Character> stack = new Stack<>();
		for (int i = 0; i < str.length(); i++) {
			char c = str.charAt(i);
			if (c == '[' || c == '{' || c == '(')
				stack.push(c);
			else {
				if (stack.isEmpty())
					return false;
				char top = stack.pop();
				if (c == ']' && top != '[')
					return false;
				if (c == '}' && top != '{')
					return false;
				if (c == ')' && top != '(')
					return false;
			}
		}
		return stack.isEmpty();
	}

-----------------------------------------------------------------------------------------------------------------------------------------------------------

(一)定义接口

Stack(E)

①void push(E)

向栈中添加一个元素  

②E pop()

拿出栈顶的元素,也就是出栈

③E peek()

扫描二维码关注公众号,回复: 3720529 查看本文章

查看栈顶的元素

④int getSize()

查看栈中元素个数

⑤boolean isEmpty()

判断栈是否为空

(二)接口的实现类

ArrayStack<E>

导入前面我已经封装好的动态数组Array类,基本操作都是调用该类方法实现的。

从用户角度看,支持这些操作就可以满足用户需求了,具体底层实现用户并不关心,实现底层有多种实现方式,本次我只采用动态数组的复用进行实现,后面我将会用链表来实现。

-----------------------------------------------------------------------------------------------------------------------------------------------------------

import Array.Array;

public class ArrayStack<E> implements Stack<E> {
	Array<E> array;

	// 构造方法
	public ArrayStack(int capacity) {
		array = new Array(capacity);
	}

	// 构造方法
	public ArrayStack() {
		array = new Array<>();
	}

	// 获得栈中的元素个数
	public int getSize() {
		return array.getSize();
	}

	// 判断栈是否为空
	public boolean isEmpty() {
		return array.isEmpty();
	}

	// 获得栈的容量
	public int getCapacity() {
		return array.getCapacity();
	}

	// 向栈中添加一个元素
	public void push(E e) {
		array.addLast(e);
	}

	// 移除栈顶的元素
	public E pop() {
		return array.removeLast();
	}

	// 查看栈顶的元素
	public E peek() {
		return array.getLast();
	}

	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("Stack:").append('[');
		for (int i = 0; i < array.getSize(); i++) {
			sb.append(array.query(i));
			if (i != array.getSize() - 1)
				sb.append(",");
		}
		sb.append("] top");
		return sb.toString();
	}
}

猜你喜欢

转载自blog.csdn.net/qq_42370146/article/details/82841120
今日推荐