stack介绍
Stack继承自Vector。底层是通过数组实现的,栈是线程安全的。
栈只能从一端添加元素,也只能从一端取出元素,这一端称为栈顶
栈的操作:
push() 入栈
pop() 出栈
peek() 查看栈顶元素,不弹出栈
search() 栈顶到该元素首次出现的位置的距离
empty() 栈是否为空
private static void testStack() {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(1);
stack.push(4);
stack.push(5);
System.out.println("===============> stack: " + stack);
stack.pop();
System.out.println("===============> stack: " + stack);
System.out.println("===============> top: " + stack.peek());
System.out.println("===============> stack isEmpty: " + stack.isEmpty());
System.out.println("===============> stack search 1: " + stack.search(1));
}
栈的应用
1. undo(撤销)操作
比如我们编辑文档,发现输入错误的时候,这时会回退,实际上对输入的内容进行入栈和出栈的操作
2. 程序调用系统栈
平时写的代码方法,在方法里面又调用了其他方法,当程序执行这些方法的时候,首先会把当前执行的方法信息记录在一个栈中,等到调用方法执行完成之后,再从栈中弹出上个方法的相关信息,然后返回原来的地方继续运行。
3. 括号匹配
给定一个字符串,只包含(, [, {, ), ], },判定字符串中的括号匹配是否合法。
如"( )”,“( ) [ ] { }"是合法的
如“( ]”,"( [ ) ]” 是非法的
public static 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{
if(stack.isEmpty())
return false;
char topChar = stack.pop();
if(c == ')' && topChar != '(')
return false;
if(c == ']' && topChar != '[')
return false;
if(c == '}' && topChar != '{')
return false;
}
}
return stack.isEmpty();
}