数据结构与算法之栈

(一) 栈

定义

栈是一种线性序列结构, 它的特殊之处在于, 栈对于其中的元素的访问做了限制, 只能从序列的某一端(栈顶)进行读写操作, 而禁止操作的另一端(栈底). 栈是一种后进先出的数据结构. 相比较数组, 栈对应的操作是数组的子集.
栈的应用应用很广泛, 如: 撤销操作, 程序调用的系统栈等.

(二) 栈的基本实现

基于<<数据结构与算法之数组>>中的动态数组实现

1.新建接口Stack
public interface Stack<E> {

	/**
	 * 获取栈中的有效元素个数
	 * 
	 * @return
	 */
	int getSize();

	/**
	 * 返回栈中有效元素是否为空
	 * 
	 * @return
	 */
	boolean isEmpty();

	/**
	 * 向栈(栈顶)中添加元素
	 * 
	 * @param e
	 */
	void push(E e);

	/**
	 * 从栈(栈顶)中取出元素
	 * 
	 * @return
	 */
	E pop();

	/**
	 * 查看栈顶元素
	 * 
	 * @return
	 */
	E peek();
}	
2.自定义ArrayStack类实现Stack接口
public class ArrayStack<E> implements Stack<E>{

	/**
	 * 动态数组
	 */
	private Array<E> array;
	
	/**
	 * 空构造函数, 穿件容量为10构造动态数组Array
	 * 
	 * @param capacity
	 */
	public ArrayStack() {
		array = new Array<>();
	}
	
	/**
	 * 构造函数, 传入容量capacity构造动态数组Array
	 * 
	 * @param capacity
	 */
	public ArrayStack(int capacity) {
		array = new Array<>(capacity);
	}

	/**
	 * 获取栈中的有效元素个数
	 */
	@Override
	public int getSize() {
		return array.getSize();
	}

	/**
	 * 返回栈中有效元素是否为空
	 */
	@Override
	public boolean isEmpty() {
		return array.isEmpty();
	}

	/**
	 * 获取栈的容量
	 * 
	 * @return
	 */
	public int getCapacity() {
		return array.getCapacity();
	}
	
	/**
	 * 向栈(栈顶)中添加元素
	 */
	@Override
	public void push(E e) {
		array.addLast(e);
	}

	/**
	 * 从栈(栈顶)中取出元素
	 * 
	 * @return
	 */
	@Override
	public E pop() {
		return array.removeLast();
	}

	/**
	 * 查看栈顶元素
	 */
	@Override
	public E peek() {
		return array.getLast();
	}
	
	@Override
	public String toString() {
		StringBuilder res = new StringBuilder();
		res.append("Statck: ");
		res.append("[");
		for (int i = 0; i < array.getSize(); i++) {
			res.append(array.get(i));
			if(i != array.getSize() - 1) {
				res.append(", ");
			}
		}
		res.append("] Top");
		return res.toString();
	}
}

测试

public static void main(String[] args) {
	ArrayStack<Integer> stack = new ArrayStack<>();
	// 依次向栈(栈顶)中添加元素: 0-4
	for (int i = 0; i < 5; i++) {
		stack.push(i);
		System.out.println(stack);
	}
	// 从栈(栈顶)中取出元素
	stack.pop();
	System.out.println(stack);
}

Top 代表栈顶方向
在这里插入图片描述

(三) 栈的应用: 括号比配

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
 
来源:力扣(LeetCode)
链接: https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路: 使用栈数据结构, 每逢左括号则压栈, 每逢右括号则出栈与其对应的左括号匹配, 匹配成功则继续, 否则返回false无效. 最后栈为空则返回true, 反之返回false. 栈顶元素反映了在嵌套的层次关系中, 最近的需要匹配的元素.

import java.util.Stack;

class Solution {
    public boolean isValid(String s) {
		Stack<Character> stack = new Stack<>();
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			if (c == '(' || c == '[' || c == '{') {
				// 每逢左括号则压栈
				stack.push(c);
			} else {
				// 栈为空的情况下, 每逢右括号则返回false
				if(stack.isEmpty()) {
					return false;
				}
                // 每逢右括号则出栈与其对应的左括号匹配, 匹配成功则继续, 否则返回false无效
				char topChar = stack.pop();
				if(c == ')' && topChar != '(' || c == ']' && topChar != '[' || c == '}' && topChar != '{') {
					return false;
				}
			}
		}
		return stack.isEmpty();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值