题目:判定字符串中开闭分隔符是否匹配
思路:
1.分解字符串成字符数组,并创建一个栈
2.如果读取的字符不是开闭分隔符,直接忽略
如果读取的字符是开分隔符则压栈
如果读取的字符是闭分隔符,且栈不为空,栈顶元素出栈,否则提示匹配错误
3.如果出栈的开分隔符与读取的闭分隔符不匹配,提示匹配错误
4.字符串处理完后,如果栈不为空,则提示匹配错误
public static boolean isMatch(String string) {
char[] chars = string.toCharArray();
LinkedListStack<Character> stack = new LinkedListStack<Character>();
for (int i = 0; i < chars.length; i++) {
if ('(' == chars[i] || '{' == chars[i] || '[' == chars[i]) {
stack.push(chars[i]);
}
if (')' == chars[i] || '}' == chars[i] || ']' == chars[i]) {
if (stack.isEmpty()) {
System.out.println("开闭分隔符不匹配!缺少与" + chars[i] + "对应的分隔符");
return false;
} else {
char temp = stack.pop();
switch (chars[i]) {
case ']':
if ('[' != temp) {
System.out.println("开闭分隔符不匹配!缺少与" + chars[i] + "对应的分隔符");
return false;
}
break;
case '}':
if ('{' != temp) {
System.out.println("开闭分隔符不匹配!缺少与" + chars[i] + "对应的分隔符");
return false;
}
break;
case ')':
if ('(' != temp) {
System.out.println("开闭分隔符不匹配!缺少与" + chars[i] + "对应的分隔符");
return false;
}
break;
default:
break;
}
}
}
}
if (!stack.isEmpty()) {
System.out.println("开闭分隔符不匹配!缺少与" + stack.top() + "对应的分隔符");
return false;
}
return true;
}
题目:中缀表达式转换成后缀表达式
性质:观察中缀表达式2+3*4和后缀表达式234*+
两种表达式的操作数次序相同,但操作符不同
思路:
1.栈中只存储"("和运算符
2.在遇到")"时,从栈中弹出运算符,直到"("出栈;但"("不输出
3.在比较运算符优先级时,只要栈顶运算符优先级不低于读取的运算符,就出栈
4.要保证栈最后为空
public static String infixToPostfix(String infix) {
char[] chars = infix.toCharArray();
StringBuffer postfix = new StringBuffer();
LinkedListStack<Character> stack = new LinkedListStack<Character>();
for (int i = 0; i < chars.length; i++) {
switch (chars[i]) {
case '(':
case '+':
case '-':
case '*':
case '/':
if (!stack.isEmpty() && compare(stack.top(), chars[i])) {
postfix.append(stack.pop());
}
stack.push(chars[i]);
break;
case ')':
while (stack.top() != '(') {
postfix.append(stack.pop());
}
stack.pop();
break;
default:
postfix.append(chars[i]);
break;
}
}
while (!stack.isEmpty()) {
postfix.append(stack.pop());
}
return postfix.toString();
}
public static boolean compare(char stackSymbol, char symbol) {
int priorityOfStack = OperatorEnum.priorityOf(stackSymbol);
int priorityOfSymbol = OperatorEnum.priorityOf(symbol);
if ((priorityOfStack - priorityOfSymbol) >= 0) {
if (priorityOfSymbol == 0) {
return false;
}
return true;
}
return false;
}
运算符以及其优先级通过枚举类型实现,如下:
public enum OperatorEnum {
PLUS('+',1), MINUS('-',1), MULTI('*',2), DIVIDE('/',2), OPENPAREN('(',0);
private Character operator;
private int priority;
private OperatorEnum(Character operator, int priority) {
this.operator = operator;
this.priority = priority;
}
public static int priorityOf(char operator) {
for (OperatorEnum oper : values()) {
if (oper.getOperator() == operator) {
return oper.getPriority();
}
}
return operator;
}
public Character getOperator() {
return operator;
}
public void setOperator(Character operator) {
this.operator = operator;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
}