题目:检验符号是否匹配. '['和']', '('和')'成对出现时字符串合法. 例如"[][]()", "[[([]([])()[])]]"是合法的; "([(])", "[())"是不合法的.
遍历字符串的每一个char, 将char与栈顶元素比较. 如果char和栈顶元素配对, 则char不入栈, 否则将char入栈. 当遍历完成时栈为空说明字符串是合法的.
代码如下:
package MyArrayStack;
public class MyArrayStack {
//定义类,使用一个缺省泛型控制输出对象
private Object[] objs=new Object[16];//实例化一个数组,作为栈的实体对象
private int size=0;
//定义一个int变量,用于作为插入弹出的标记,size始终指向可以插入的位置,初始化为0,栈空
//判断栈空
public boolean isEmpty(){
return size==0; //如果栈空返回1,否则返回0
}
//清空栈
public void clear(){
for(int i=0;i
objs[size]=null;
}
size=0;
}
//返回栈的长度
public int length(){
return size;
}
//压栈操作
public boolean push(T data){
if(size>=objs.length){ //如果size>当前栈长度,调用扩容方法
resize();
}
objs[size]=data; //将当前元素赋值到栈中
size++;//size移动到新的位置
return true;
}
//出栈操作
@SuppressWarnings("unchecked")
public T pop(){
if(size==0){
return null; //如果栈长为0,返回空
}
size--; //现将size指向有值的位置
return (T) objs[size]; //取出size,这时不需移动size位置。
}
//扩容栈
private void resize(){
Object[] temp=new Object[objs.length*3/2+1]; //先将栈的实际容量扩大为原来的1.5倍
for(int i=0;i
temp[i]=objs[i]; //将原有元素赋值到temp中
objs[i]=null; //原栈元素置空
}
objs=temp; //将temp赋值到objs中,使之成为新的栈元素
}
public String toString(){
StringBuilder sb=new StringBuilder();
sb.append("MyArrayStack:[");
for(int i=0;i
sb.append(objs[i].toString());
if(i!=size-1){
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
public static void main(String[] args){
//使用字符类Character声明泛型
MyArrayStackms=new MyArrayStack();
String s="{{}}()(){({){}}}";
char[] a=s.toCharArray();
for(int i=0;i
Character t=ms.pop();
//每次会先出栈当前的栈顶元素
if(t==null){
ms.push(a[i]);
}
else if(t=='{'&&a[i]=='}'){
//如果匹配,就不进行动作处理,栈顶元素已经出栈
}else if(t=='('&&a[i]==')'){
}
else{
//不匹配的话,将栈顶元素和新元素一起出栈
ms.push(t);
ms.push(a[i]);
}
/*String s1=ms.toString();
System.out.println(s1);*/
}
if(ms.length()==0){
System.out.println("YES");
}else{
System.out.println("NO");
}
}
}