栈的概念:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。
进行数据插入和删除操作的 一端称为栈顶,另一端称为栈底。
栈中的数据元素遵守后进先出的原则。
压栈(push):栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈(pop):栈的删除操作叫做出栈。出栈是后进先出。
查看栈顶元素(peek):只看栈顶元素不改变栈中的元素。
进栈出栈的过程
对栈进行压栈,出栈,查看栈顶元素代码操作:
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
//将ABC压入栈中,实现调用方法;
stack.push("A");
stack.push("B");
stack.push("C");
System.out.println(stack.size()); // 3
System.out.println(stack.isEmpty()); // false
System.out.println(stack.empty()); // false
System.out.println(stack);
System.out.println(stack.peek()); // C
System.out.println(stack.peek()); // C
System.out.println(stack.pop()); // C
System.out.println(stack.pop()); // B
}
}
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。
队列具有先进先出的原则。
入队列:进行插入操作的一端称为队尾;
出队列:进行删除操作的一端称为队头
add():把元素放入队列中;
remove():删除队首元素;
eiement():查看队首元素;
把元素放入队列中,进行查看队首元素和删除方法的代码操作:
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
//把元素放入队列中,进行查看队首元素和删除方法调用;
queue.add("A");
queue.add("B");
queue.add("C");
System.out.println(queue);
System.out.println(queue.remove()); // A
System.out.println(queue.element()); // B
System.out.println(queue.remove()); // B
}
练习对栈中方法的使用:
练习一:
p20:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1:左括号必须用相同类型的右括号闭合。
2:左括号必须以正确的顺序闭合。
public boolean isValid(String s){
//整体考虑将所有的左括号放入栈中,如果为空栈返回false,
//再将左括号出栈 一个一个的与右括号相匹配,如果剩下就是不满足条件的return false;
Stack<Character> stack = new Stack<>();
char[] chars =s.toCharArray();
for (char ch:chars){
if (ch == '('||ch =='['||ch == '{'){
stack.push(ch);
}else{
if (stack.isEmpty()){
return false;
}
char left = stack.pop();
if (left == '('&& ch == ')'){
}else if( left == '['&& ch == ']'){
}else if (left == '{'&& ch == '}'){
}else{
return false;
}
}
}
return stack.isEmpty();
}