1.栈(Stack)
首先栈并不是内存中的栈,此栈为数据结构的中的栈。
1.1栈的基本概念
栈是一种数据结构,它用来存储一组相同的数据,它秉承着先进后出的原理来进行存储数据。因此它只能在一端进行操作数据,那么存储数据我们叫压栈,删除数据我们叫出栈,存储数据与删除数据都在一端进行。如下图所示:
编辑上图中我先依次进行了压栈,然后再进行出栈。你也可以边进行压栈边进行出栈,如压入2后立马出2,再压入3。就会出现下图效果:
编辑
1.2栈的使用
方法 | 实现效果 |
Stack<> | 创建一个<>空栈,<>里面类型自拟 |
push(e) | 将e压入栈中 |
pop() | 将栈顶元素移除栈中 |
peek() | 显示栈顶元素 |
size() | 求栈的大小 |
empty() | 判断栈是否为空 |
1.2.1创建一个栈
创建一个栈格式为:Stack<引用类型> 引用名 = new Stack<引用类型>();注意,后面<>内容可以省略。
Stack<Integer> stack = new Stack<>();
以上代码,为一个整型的栈,栈里面可以存放关于整型的数据。
1.2.2push方法
push就是压栈,通俗的来说就是往栈里面存储数据,它的使用方法,通过引用名直接进行调用。如以下代码:
public static void main(String[] args) { //实例化一个栈 Stack<Integer> stack = new Stack<>(); //压入两个元素 stack.push(1); stack.push(2); //打印栈 System.out.println(stack); //压入一个元素 stack.push(3); //打印栈 System.out.println(stack); }
运行后输出:
编辑
压栈是从头开始往栈里面进行存储数据的,但进行打印的时是从栈底往栈顶的顺序进行打印的。
编辑
1.2.3pop方法
pop为出栈,出栈也是从栈顶的位置出。一旦对栈进行pop,栈顶元素就不复存在了。如:
public static void main(String[] args) { //实例化一个栈 Stack<Integer> stack = new Stack<>(); //压入两个元素 stack.push(1); stack.push(2); //打印栈 System.out.println(stack); //出栈 stack.pop(); //打印栈 System.out.println(stack); }
运行后输出:
编辑编辑
1.2.4peek方法
peek为取得栈顶元素,但并不会删除掉栈顶元素。如:
public static void main(String[] args) { //实例化一个栈 Stack<Integer> stack = new Stack<>(); //压入两个元素 stack.push(1); stack.push(2); //打印栈 System.out.println(stack); //显示栈顶元素 System.out.println(stack.peek()); }
运行后输出:
编辑
1.2.5size方法
size是求得栈的大小,也是直接通过引用名调用即可。
public static void main(String[] args) { //实例化一个栈 Stack<Integer> stack = new Stack<>(); //压入两个元素 stack.push(1); stack.push(2); //栈的大小 System.out.println(stack.size()); }
运行后输出:
编辑
1.2.6empty方法
empty是判断栈是否为空,如:
public static void main(String[] args) { //实例化一个栈 Stack<Integer> stack1 = new Stack<>(); //实例化第二个栈 Stack<Integer> stack2 = new Stack<>(); //压入两个元素 stack1.push(1); stack1.push(2); //栈是否为空 System.out.println("栈1:"+stack1.empty()); System.out.println("栈2:"+stack2.empty()); }
运行后输出:
编辑我们可以发现,关于栈相关的方法是使用是非常的遍历的,我们只需要引用.这些方法名就能操作相应的数据。在理解相应的方法用途后,我们再来练习一道题目。
1.3力扣(Leetcode)之有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
public class Test { public static boolean isValid(String s) { Stack<Character> stack = new Stack<>(); if (s == null) { return false; } for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); if (ch == '(' || ch == '{' || ch == '[') { stack.push(ch); }else { if (stack.empty()) { return false; } char ch2 = stack.peek(); if (ch2 == '(' && ch == ')' || ch2 == '{' && ch == '}' || ch2 == '[' && ch == ']' ) { stack.pop(); }else { return false; } } } if (!stack.empty()) { return false; } return true; } public static void main(String[] args) { String str1 = "()[]{}"; String str2 = "(()"; System.out.println(isValid(str1)); System.out.println(isValid(str2)); } }