【code基础】stack
官方定义的栈使用
两种定义stack的方法:
- 一种是使用系统自带的Stack,具有线程安全性;
- 另一种是使用Deque(双端队列),是官方较为推荐的,其有ArrayDeque和LinkedList这两种实现类
Deque实现类是LinkedList、ArrayDeque、LinkedBlockingDeque
定义
//三种定义
Stack<Integer> stack0 = new Stack<>();
Deque<Integer> stack1 = new ArrayDeque<>();
Deque<Integer> stack2 = new LinkedList<>();
deque和Stack实现类的差别
- deque,从左边进左边出,栈底在右侧
- Stack,从右边进右边出,栈底在左侧
栈的操作
boolean empty()
测试栈是否为空Object peek( )
查看栈顶部的对象,但不从栈中移除它Object pop( )
移除栈顶部的对象,并作为此函数的值返回该对象Object push(Object element)
把项压入栈顶部int search(Object element)
返回对象在栈中的位置,以 1 为基数
java代码
- 栈的定义
public class StackInitial {
public static void main(String[] args) {
//不同实现的区别1-- new Stack
Stack<Integer> stack = new Stack<>();
stack.push(8);
stack.push(9);
//stack的打印和转换成list的方法
System.out.println(new ArrayList<>(stack)); // [8,9]
List<Integer> list1 = stack.stream().collect(Collectors.toList());//[8,9]
System.out.println(list1); //[8, 9]
System.out.println(stack); //[8, 9]
System.out.println(stack.peek()); //9
stack.pop();
System.out.println(stack); //[8]
//不同实现的区别2-- new ArrayDeque
Deque<Integer> deque = new ArrayDeque<>(); //推荐写法
deque.push(8);
deque.push(9);
// 推荐使用Deque定义,deque转成ArrayList或stream时保留了“后进先出”的语义
System.out.println(new ArrayList<>(deque)); // [9,8]
List<Integer> list2 = deque.stream().collect(Collectors.toList());//[9,8]
System.out.println(list2);// [9,8]
System.out.println(deque);// [9,8]
System.out.println(deque.peek());//9
deque.pop();
System.out.println(deque); //[8]
}
}
- 栈的使用
public class StackMain {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(5);
stack.push(13);
stack.push(8);
stack.push(6);
if (stack.empty()){
System.out.println("Stack is empty!");
return;
}
stack.pop();
System.out.println("The top element is:" + stack.peek()); //The top element is:8
System.out.println("The size is :" + stack.size()); //The size is :3
}
}