package edu.mama.ls14.homework;
public class Homework {
/**
* 第一题:写一个先进后出的集合类
* 要求:实现Stack接口,并补充完成以下方法
*/
public static void stack() {
//TODO 创建Stack的实例,指定泛型为String
Stack<String> stack = new DemoStack<>();
//TODO 依次向Stack中装入字符串"Java"、"Python"、"Scala"、"C"、"C++"
stack.push("Java");
stack.push("Python");
stack.push("Scala");
stack.push("C");
stack.push("C++");
//TODO 打印栈中元素的数量
System.out.println(stack.size());
//TODO 查看栈顶元素并打印
System.out.println(stack.peek());
//TODO 取出栈顶元素并打印
System.out.println(stack.pop());
//TODO 再次取出栈顶元素并打印
System.out.println(stack.pop());
//TODO 判断栈是否为空
System.out.println(stack.isEmpty());
//TODO 将栈中的元素拼接成用逗号分隔的字符串并打印输出
System.out.println(stack.toString());
}
/**
* 第二题:str是一个含有英文括号的字符串,验证其括号是否正确配对
* 提示:只会出现英文括号"{"、"}"、"["、"]"、"("、")"
* @param str
* @return 匹配正确,则返回true,反之返回false
*/
public static boolean verify(String str) {
//TODO 这里写下你的代码
Stack<Character> stack = new DemoStack<>();
char[] arr = str.toCharArray();
for (char c : arr) {
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
continue;
}
if (c == ')' || c == ']' || c == '}') {
char t = stack.pop();
boolean b1 = t == '(' && c != ')';
boolean b2 = t == '[' && c != ']';
boolean b3 = t == '{' && c != '}';
if ( b1 || b2 || b3) {
return false;
}
}
}
return stack.isEmpty();
}
public static void main(String[] args) {
stack();
/*
{()[]}
{ 压栈,栈:{
( 压栈,栈:{,(
) 出栈(进行配对,栈:{
[ 压栈,栈:{,[
] 出栈[进行配对,栈:{
} 出栈{进行配对,栈:空
如果是空栈,则匹配成功
*/
System.out.println("-----------------------------");
System.out.println(verify("{()[]}"));
System.out.println(verify("这里{有(很多]干扰)的[文}字"));
System.out.println(verify("{name:'张三', value:[{course:'语文', score:85}, {course:'数学', score:92}]}"));
}
}
DemoStack.java
package edu.mama.ls14.homework;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
public class DemoStack<E> implements Stack<E> {
private final List<E> data = new ArrayList<>();
/**
* 将元素压入到栈顶
* @param e
*/
public void push(E e) {
data.add(e);
}
/**
* 取出栈顶元素
* @return 栈顶元素
*/
public E pop() {
E e = peek();
data.remove(data.size() - 1);
return e;
}
/**
* 查看栈顶元素,但不从栈中移除它
* @return 栈顶元素
*/
public E peek() {
return data.get(data.size() - 1);
}
/**
* 判断集合是否为空
* @return
*/
public boolean isEmpty() {
return data.isEmpty();
}
/**
* 获取集合中元素的数量
* @return 元素的数量
*/
public int size() {
return data.size();
}
/**
* 将栈转换成数组
* @return
*/
public E[] toArray() {
if (isEmpty()) {
return null;
}
E[] arr = (E[]) Array.newInstance(data.get(0).getClass(), data.size());
arr = data.toArray(arr);
return arr;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
for (int i = data.size() -1; i >= 0 ; i--) {
builder.append(data.get(i)).append(",");
}
builder.deleteCharAt(builder.length() - 1);
return builder.toString();
}
}