用堆栈实现括号匹配——ADT实现

来源:互联网 发布:淘宝一千零一夜视频 编辑:程序博客网 时间:2024/05/18 02:39

/**********************栈的定义*********************************/


package pk.stack;

public class OrderStack {
private int count;
private int capacity;
private int capacityIncrement;
private Object[] itemArray;


public OrderStack() {// 初始化栈
count = 0;
capacity = 10;
capacityIncrement = 5;
itemArray = new Object[capacity];
}


public boolean isEmpty() {
return (count == 0);
}


public void push(Object x) {
if (count == capacity) {// 栈满时,扩展栈
capacity += capacityIncrement;
Object[] tempArray = new Object[capacity];
for (int i = 0; i < count; i++) {
tempArray[i] = itemArray[i];
}
itemArray = tempArray;
}
itemArray[++count] = x;//将x入栈
}

public Object pop() {//出栈
if(count == 0) {
return null;
} else {
return itemArray[--count];
}
}

public Object peak() {//查看栈顶元素
if(count == 0) {
return null;
} else {
return itemArray[count-1];
}
}
}


/************************匹配分析******************************/


package pk.stack;


public class ParenMatcher {
private String inputString;
private String outputString;


private boolean match(char c, char d) {
switch (c) {//当且仅当对应括号匹配时,返回真值
case '(':
return (d == ')');
case '[':
return (d == ']');
case '{':
return (d == '}');
default:
return false;
}
}


public void parenMatch() {
OrderStack parenMatch = new OrderStack();
int n = inputString.length();
char c;
char d;
int i = 0;
while (i < n) {
d = inputString.charAt(i);
if (d == '(' || d == '[' || d == '{') {
parenMatch.push(new Character(d));// 若是左括号,则入栈
} else if (d == ')' || d == ']' || d == '}') {// 否则是右括号,则出栈
if (parenMatch.isEmpty()) {// 出栈时,先判断栈是否为空
//System.out.println("栈目前为空");
output("栈目前为空");
return;
} else {
c = ((Character) parenMatch.pop()).charValue();// 因为压栈时是以Object类型压的
// 所以出栈时必须先将它强行转化
// 成自己的类型
if (!match(d, c)) {
//System.out.println("不匹配!");
output(d + "和" + c + "不匹配!");
}
}
}
i ++;//扫描下一个字符
}
}

private void output(String s) {
outputString = s;
}

public void setInput(String s) {
inputString = s;
}

public String getOutput() {
return outputString;
}
}


/***********************测试案例Applet*************************/


package pk.stack;


import java.applet.Applet;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class ParenMatchApplet extends Applet implements ActionListener {
/**

*/
private static final long serialVersionUID = 1L;
Label
instructionLable,inputLable,outputLable;
TextField 
inputField,outputField;
ParenMatcher PM;

public void init() {
instructionLable = new Label("在下面输入一个表达式并按回车键",Label.CENTER);
add(instructionLable);

inputLable = new Label("input:");
add(inputLable);
inputField = new TextField(40);
add(inputField);
inputField.addActionListener(this);

outputLable = new Label("output:");
add(outputLable);
outputField = new TextField(40);
add(outputField);

inputField.requestFocus();
PM = new ParenMatcher();//创建一个新的括号匹配器对象

}

public void actionPerformed(ActionEvent evt) {
PM.setInput(evt.getActionCommand());//将输入字符串发送到括号匹配器对象PM中
PM.parenMatch();//分析匹配情况
outputField.setText(PM.getOutput());
}

}