问题描述:
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
An input string is valid if:
Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.
Example 1:
Input: "()"
Output: true
Example 2:
Input: "()[]{}"
Output: true
Example 3:
Input: "(]"
Output: false
Example 4:
问题解决思路:
使用栈,遍历输入字符串
如果当前字符为左半边括号时,则将其压入栈中
如果遇到右半边括号时,分类讨论:
1)如栈不为空且为对应的左半边括号,则取出栈顶元素,继续循环
2)若此时栈为空,则直接返回false
3)若不为对应的左半边括号,反之返回false
代码实现:
package Algorithm;
import java.util.Stack;//导入java的stack,可以直接进行栈操作
public class Example1 {
//首先写一个匹配的方法,具体为,所有的左括号都是入栈操作,所有的有括号都是出栈操作,
//如果最后栈内元素为空,则匹配成功,否则匹配不成功(不包含开始空栈的情况)
//所以需要进行异常处理
public boolean Match(String expression){
if (expression==null || expression==""){
System.out.print("没有输入表达式或者表达式为空");
}
Stack<Character> stack = new Stack<Character>();//这里是调用java的stack类实现栈操作
for (int index = 0; index < expression.length(); index++){
switch (expression.charAt(index)) {
case '(':
stack.push(expression.charAt(index));
break;
case ')':
if (!stack.empty() && stack.peek()== '('){
stack.pop();
}
break;
case '{':
stack.push(expression.charAt(index));
break;
case '}':
if (!stack.empty() && stack.peek()== '{'){
stack.pop();
}
break;
case '[':
stack.push(expression.charAt(index));
break;
case ']':
if (!stack.empty() && stack.peek()== '['){
stack.pop();
}
}
}
if (stack.empty())
return true;
return false;
}
public static void main(String[] args) {
String expression = "(1+2)-5*{9}";
Example1 object = new Example1();
boolean flag = object.Match(expression);
if (flag){
System.out.print("匹配成功");
}
else{
System.out.print("匹配不成功");
}
}
}
//1 boolean empty() 测试堆栈是否为空。
//2 Object peek( ) 查看堆栈顶部的对象,但不从堆栈中移除它。
//3 Object pop( ) 移除堆栈顶部的对象,并作为此函数的值返回该对象。
//4 Object push(Object element) 把项压入堆栈顶部。
//5 int search(Object element) 返回对象在堆栈中的位置,以 1 为基数