栈的基本原理和简单应用(括号匹配-Java)
-
基本原理
栈(堆栈)是一种运算受限的线性表,只允许在表的一端进行插入(入栈:push)和删除(出栈:pop)运算。其可以进行运算的一端被称为栈顶,而另一端被称为栈底。
-
实现
在Java中提供了专门用于栈操作的类,Stack类(java.util.Stack),它继承了Vector类
Stack类提供了几个基本方法:
E push(E item):入栈
synchronized E pop():出栈,会先调用peek()方法
synchronized E peek():返回最后一个元素,如果长度为0,抛出EmptyStackException异常
synchronized int search(Object o):查找距离栈顶最近的o元素的索引
3.括号匹配
基本思路为用栈存储每一个遇到的左括号,在遇到右括号时判断栈顶元素是否是与之对应的左括号,是则出栈,否则返回错误信息。
这个过程需要遍历每一个括号字符,且执行完成后栈内没有剩余的字符。
具体实现:
package demo.stack;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class StackDemo {
// a Stack
private static Stack<Character> stack;
// relation of brackets
private static Map<Character, Character> relation = new HashMap<>();
static {
relation.put('{', '}');
relation.put('[', ']');
relation.put('(', ')');
}
/**
* Judging whether bracket matching is legal wrong example:{(]},}{},{})
*
* @param bracketStr
* @return isLegal
*/
public static int isLegal(String bracketStr) {
stack = new Stack<>();
// an array for brackets
char[] brackets = bracketStr.toCharArray();
// a flag for brackets is legal(0) or not(-1)
int isLegal = 0;
for (int i = 0; i < brackets.length; i++) {
if (brackets[i] == '{' || brackets[i] == '[' || brackets[i] == '(') {
stack.push(brackets[i]);
} else if (brackets[i] == '}' || brackets[i] == ']' || brackets[i] == ')') {
if (stack.empty()) {
return -1;
} else {
if (!(relation.get(stack.pop()) == brackets[i])) {
return -1;
}
}
}
}
if (!stack.empty()) {
isLegal = -1;
}
return isLegal;
}
}
测试方法:
/**
* Stack Test
*/
@Test
public void test() {
String[] bracketsArray = {
"{}(",
"{{{[]()}{}[]}(({}))}",
"{{{{]}(){}[]}}}",
"{[()({}{})({})]}"
};
for(String brackets:bracketsArray) {
int isLegal = StackDemo.isLegal(brackets);
if(isLegal == 0) {
System.out.println("Brackets \""+ brackets +"\" is legal.");
}else {
System.out.println("Brackets \""+ brackets +"\" is not legal.");
}
}
}