左右符號對稱問題
寫一個介面
package stack;
public interface Stack<E> {
int size();
boolean isEmpty();
void push(E e);
E top();
E pop();
}
實作Stack Push Pop 方法
package stack;
public class ArrayStack<E> implements Stack<E>{
public static int CAPACITY = 100;
private E[] data;
private int t = -1;
public ArrayStack(){ this(CAPACITY);}
public ArrayStack(int capacity) {
data = (E[]) new Object[capacity];
}
@Override
public int size() {
return t+1;
}
@Override
public boolean isEmpty() {
return t==-1;
}
@Override
public void push(E e) {
if(size()==data.length) throw new IllegalStateException("Stack is full");
data[++t] = e;
}
@Override
public E top() {
if(isEmpty()) return null;
return data[t];
}
@Override
public E pop() {
if (isEmpty()) return null;
E answer = data[t];
data[t] = null;
t--;
return answer;
}
}
寫一個Delimiter 物件
public class Delimiter {
char c;
int pos;
public Delimiter(char c, int pos){
this.c = c;
this.pos = pos;
}
}
package stack;
import java.util.Scanner;
public class MatchDelimiter {
static String str ;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Delimiter d;
// str = "((a+b)*(c+d))";
// str ="((a+b)*(c+d()";
// str = "(4*5+6*(7+8)/2-(4*3)-2)*3";
str = "((a+b)-c*e)+(e*(f-g)";
Stack<Delimiter> buf = new ArrayStack<>();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
switch (ch){
case '(': buf.push(new Delimiter('(',i)); break;
case ')':
if (!buf.isEmpty()){
d = buf.pop();
if (d.c=='('){
System.out.println(d.pos+","+i);
}
}
break;
}
}
while (!buf.isEmpty()){
d = buf.pop();
System.out.println(d.pos+",-1");
}
}
}