问题:如何使用栈来判定括号是否匹配
解答:对于给定的表达式,可以使用栈来实现括号匹配判定算法。这个算法在编译器中非常重要。解析器每次读入一个字符,如果字符是一个开分隔符(如(、{、或 [ ),那么将其入栈。若读入的是一个闭分隔符(如)、}、或 ] ),那么将栈顶的开分隔符出栈,并与闭分隔符比较。如果两者匹配,则继续解析字符串。如果不匹配,解析器显示匹配错误。下面给出一个时间复杂度为O(n)的基于栈的符号匹配判定算法。
算法:
a.创建一个栈。
b.当(当前字符不等于输入的结束字符)
(1)如果当前字符不是匹配的字符,则忽略它。
(2)如果字符是一个开分隔符(如(、{ 或 [ ),那么将其入栈。
(3)如果字符是一个闭分隔符(如)、} 或 ] ),且栈不为空,栈顶元素出栈,否则提示匹配错误。
c.字符串处理结束后,如果栈不为空,则提示匹配错误。
public class DynArrayStack {
private int top;
private int capacity;
private int array[];
public DynArrayStack(){
capacity=20;
array=new int[capacity];
top=-1;
}
public boolean isEmpty(){
return (top==-1);
}
public boolean isStackFull(){
return (top==capacity-1);
}
public void push(int data){
if(isStackFull()) doubleStack();
array[++top]=data;
}
private void doubleStack(){
int newArray[]=new int[capacity*2];
System.arraycopy(array, 0, newArray, 0, capacity);
capacity=capacity*2;
array=newArray;
}
public int pop(){
if(isEmpty()) {
//System.out.println("Stack Overflow");
return -1;
}
else return (array[top--]);
}
public void deleteStack(){
top=-1;
}
}
/*public static void arraycopy(Object src, int srcPos,Object dest,int destPos, int length)
其中:src表示源数组,srcPos表示源数组要复制的起始位置,desc表示目标数组,length表示要复制的长度。
*/
public class Firsttest {
public static void main(String args[]){
DynArrayStack array1=new DynArrayStack();
String s1;
Scanner reader=new Scanner(System.in);
s1=reader.next();
int i=0;
while(i<s1.length()){
char c = s1.charAt(i);
switch (c) {
case '(':
case '{':
case '[':
array1.push(c);
break;
case ')': if(array1.isEmpty()||array1.pop()!='(') {
System.out.println("括号匹配错误");
return;
}
break;
case '}': if(array1.pop()!='{'||array1.isEmpty()){
System.out.println("括号匹配错误");
return;
}
break;
case ']':if(array1.pop()!='['||array1.isEmpty()){
System.out.println("括号匹配错误");
return;
}
break;
default:
}
i++;
}
if(array1.isEmpty()) System.out.println("括号匹配正确");
else System.out.println("括号匹配错误");
}
}