/**
* Stack类extends Vector 栈容器
* 扩充了五个方法 push() peek() pop() empty() search()
* 栈中的方法遵循后进先出 main方法需要等所有方法执行完弹出后才会弹出 方法的递归每一层都要等下一层结束/弹出才能结束/弹出
* 后进的方法位于栈顶 弹出顺序从栈顶往栈底
*/
public class TestStack {
public static void main(String[] args) {
Stack<String> st1 = new Stack<>();
//实例化栈容器是为了使用Stack的五种方法 使用List引用的话无法调用这些方法 这里需要用Stack引用
st1.push("a");
//向栈容器中添加item 替代Vector的.add
st1.push("b");
//每一个新添加的item都会位于栈顶 1位 栈容器从1开始算位置
System.out.println(st1);
//打印结果仍为[a,b] 但这不符合栈容器的用法
st1.push("c");
//将item推进栈中
System.out.println(st1.search("c")+"结果为1 最后添加的c会位于栈顶 1位");
System.out.println(st1.search("a")+"结果为3 目前有三个item 最早添加的a位于最下侧 3位");
//.search()方法从栈顶往栈底查找返回匹配的第一个元素,无论底下是否有重复元素都只会返回第一个
String pop1 = st1.pop();
System.out.println(pop1);
//.pop()会将栈顶的item弹出 并返回该item c在栈顶 结果为c 弹出后b在栈顶
System.out.println(st1.peek());
//peek偷窥 返回栈顶的item但不删除 结果为b 固定查看栈顶的item
System.out.println(st1.empty());
//.empty()判断栈容器是否为空 替代Vector的.isEmpty()
//利用Stack判断对称性
String str = "..{...[...(...)....]....}....(...).....[....]";
//模拟一段代码的语句,这里用...代替代码的字符,只看三种括号,代码中的括号一定是对称的,有左括号就有右括号
System.out.println(symmetry(str));
//symmetry对称性 这里忽略...判断括号的对称性 括号是成对使用的 并且遵守后进先出
// 这个方法用于判断语句结构的问题 如左括号和右括号数量不一致、语句中途在没有左括号的情况下出现右括号
}
static boolean symmetry(String str){
Stack<String> s = new Stack<>();
for (int i = 0;i<str.length();i++){
//.length()字符串的长度
char c = str.charAt(i);
//返回index位的字符
if (c=='{'){
s.push("}");
}
if (c=='['){
s.push("]");
}
if (c=='('){
s.push(")");
}
//括号一定是先写左括号 每一个左括号都应当对应一个右括号
//当出现左括号 向Stack栈容器中添加一个右括号 当出现右括号 从Stack中pop右括号
if (c=='}'||c==']'||c==')'){
if (!s.empty()) {
String pop = s.pop();
//弹出栈顶的括号 要弹出就要确保容器中有元素 先判定是否为空
if (pop.charAt(0) != c) {
//弹出的字符串为一个右括号 对字符串取0位字符即将字符串括号转化为字符
//如果先出的不是最后入的括号种类 说明符号不对称
return false;
}
// String cTemp = ""+c;也可以将字符c转换为字符串判定
// if(!cTemp.equals(s.pop()))return false;
// 又或者s定义为Stack<Char> 直接比较字符
}else {
//如果s为空说明字符串中缺少左括号 不对称
return false;
}
}
}
// if (!s.empty()){
// //如果字符串遍历完,容器中还有括号没被pop说明字符串左右括号数量不对等
// return false;
// }
// return true;对称返回true
return s.empty();
//判断s是否为空的结果决定了是否对称,为空则对称,不为空则不对称,所以直接返回s.empty()即为对称性的结果
}
}