栈应用1(判定括号是否匹配)-笔记

问题:如何使用栈来判定括号是否匹配
解答:对于给定的表达式,可以使用栈来实现括号匹配判定算法。这个算法在编译器中非常重要。解析器每次读入一个字符,如果字符是一个开分隔符(如(、{、或 [ ),那么将其入栈。若读入的是一个闭分隔符(如)、}、或 ] ),那么将栈顶的开分隔符出栈,并与闭分隔符比较。如果两者匹配,则继续解析字符串。如果不匹配,解析器显示匹配错误。下面给出一个时间复杂度为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("括号匹配错误");
}
}

猜你喜欢

转载自blog.csdn.net/qq_40636998/article/details/85274331