• 栈(Java)


    目录

    1.什么是栈

    2.栈的使用

    3.栈的模拟实现


    1.什么是栈

    栈:是一种特殊的线性表只允许在其固定的一端进行插入和删除操作。栈中的元素遵循先进后出(后进先出)原则

    栈顶:进行插入和删除数据的一端

    栈底:始终不进行插入和删除操作的一端

    压栈:栈的插入操作,也可叫做进栈、入栈

    出栈:栈的删除操作

    压栈和出栈都在栈顶 

    栈类似于弹夹,栈中的元素类似于子弹,最先放入弹夹中的子弹最后打出,最后放入弹夹中的子弹最先打出,同样的,先入栈的元素后出栈,后入栈的元素先出栈

    2.栈的使用

    栈中存储的是相同类型的数据,因此可以使用链表或是数组来实现栈,而在Java中,提供了Stack类,是用数组实现的栈。

    Stack类位于 java.util 包中,使用前需要导包 

    import java.util.Stack;

    Stack的构造方法:

     Stack()

    无参构造方法,构造一个空的栈

    Stack stack = new Stack<>();

    常用的方法:

    E push(E e)

    作用:将e入栈,并返回e 

    1. class Test{
    2. public static void main(String[] args) {
    3. Stack stack = new Stack<>();//创建一个空的栈,栈中存放数据类型为Integer
    4. stack.push(3);//将3压入栈中,并返回3
    5. stack.push(55);
    6. System.out.println(stack.push(44));//输出:33
    7. System.out.println(stack);//输出:[3, 55, 44]
    8. }
    9. }

     E pop()

    作用:将栈顶元素出栈并返回

    1. class Test{
    2. public static void main(String[] args) {
    3. Stack stack = new Stack<>();
    4. stack.push(22);
    5. stack.push(33);
    6. System.out.println(stack.pop());//输出:33
    7. }
    8. }

     若栈中无元素,调用pop()方法,会抛出异常 EmptyStackException 

    E peek()

    作用:获取栈顶元素,但不将栈顶元素出栈

    1. class Test{
    2. public static void main(String[] args) {
    3. Stack stack = new Stack<>();
    4. stack.push(22);
    5. stack.push(33);
    6. stack.push(44);
    7. System.out.println(stack.peek());//输出:44
    8. System.out.println(stack);//输出:[22, 33, 44]
    9. }
    10. }

    若栈中无元素,调用peek()方法时,也会抛出异常 EmptyStackException 

    int size()

    作用:获取栈中有效元素个数

    boolean empty()

    作用:判断栈是否为空

    1. class Test{
    2. public static void main(String[] args) {
    3. Stack stack = new Stack<>();
    4. stack.push(22);
    5. stack.push(33);
    6. stack.push(44);
    7. System.out.println(stack.size());//输出:3
    8. System.out.println(stack.isEmpty());//输出:false
    9. }
    10. }

    3.栈的模拟实现

    我们可以使用链表或是数组来模拟栈

    (1)使用数组模拟实现栈

    先定义栈,和栈的构造方法

    1. public class MyStack {
    2. private int[] elem;//使用数组模拟实现栈
    3. private int usedSize;//表示有效长度,同时也可表示当前位置可以存放元素
    4. private static final int DEFAULT_CAPACITY = 10;
    5. public MyStack(){
    6. //初始化栈
    7. this.elem = new int[DEFAULT_CAPACITY];
    8. }
    9. }

    计算栈中元素个数

    1. //计算栈中元素个数
    2. public int size(){
    3. return this.usedSize;
    4. }

    判断栈是否为空

    若usedSize为0则表明栈中没有元素,返回true,反之,返回false

    1. public boolean empty(){
    2. return usedSize == 0;
    3. }

    入栈

    将元素放入栈中,首先要判断栈是否满了,若满了,则需要先扩容,再将元素放入栈中

    1. //入栈
    2. public void push(int data){
    3. //先判断栈是否满
    4. if(usedSize == elem.length){
    5. //扩容
    6. elem = Arrays.copyOf(elem,2*elem.length);
    7. }
    8. //将data放入栈中,并将usedSize+1
    9. elem[usedSize++] = data;
    10. }

    出栈

    若栈为空,则抛出异常;不为空,则将栈顶元素出栈

    1. public int pop(){
    2. if(empty()){
    3. throw new EmptyStackException();
    4. }
    5. int data = elem[usedSize-1];
    6. usedSize--;
    7. return data;
    8. }

    获取栈顶元素

    若栈为空,抛出异常;不为空,返回栈顶元素

    1. public int peek(){
    2. if(empty()){
    3. throw new EmptyStackException();
    4. }
    5. int data = elem[usedSize-1];
    6. return data;
    7. }

    完整代码

    1. import java.util.Arrays;
    2. import java.util.EmptyStackException;
    3. public class MyStack {
    4. private int[] elem;//使用数组模拟实现栈
    5. private int usedSize;//表示有效长度,同时也可表示当前位置可以存放元素
    6. private static final int DEFAULT_CAPACITY = 10;
    7. public MyStack(){
    8. //初始化栈
    9. this.elem = new int[DEFAULT_CAPACITY];
    10. }
    11. //计算栈中元素个数
    12. public int size(){
    13. return this.usedSize;
    14. }
    15. //判断栈是否为空
    16. public boolean empty(){
    17. return usedSize == 0;
    18. }
    19. //入栈
    20. public void push(int data){
    21. //先判断栈是否满
    22. if(usedSize == elem.length){
    23. //扩容
    24. elem = Arrays.copyOf(elem,2*elem.length);
    25. }
    26. //将data放入栈中,并将usedSize+1
    27. elem[usedSize++] = data;
    28. }
    29. //出栈
    30. public int pop(){
    31. if(empty()){
    32. throw new EmptyStackException();
    33. }
    34. int data = elem[usedSize-1];
    35. usedSize--;
    36. return data;
    37. }
    38. //获取栈顶元素
    39. public int peek(){
    40. if(empty()){
    41. throw new EmptyStackException();
    42. }
    43. int data = elem[usedSize-1];
    44. return data;
    45. }
    46. }

    (2)使用链表模拟实现栈

    1. public class MyStack {
    2. static class ListNode {
    3. private int val;
    4. private ListNode next;
    5. public ListNode(int val) {
    6. this.val = val;
    7. }
    8. }
    9. private ListNode head;
    10. private int size;
    11. //判断栈是否为空
    12. public boolean empty(){
    13. return size == 0;
    14. }
    15. //计算栈中元素个数
    16. public int size(){
    17. return size;
    18. }
    19. //入栈
    20. public void push(int data){
    21. ListNode node = new ListNode(data);
    22. //头插
    23. if(empty()) {
    24. this.head = node;
    25. }else {
    26. node.next = this.head;
    27. this.head = node;
    28. }
    29. size++;
    30. }
    31. //出栈
    32. public int pop(){
    33. if(empty()){
    34. throw new EmptyStackException();
    35. }
    36. //头删
    37. int data = head.val;
    38. head = head.next;
    39. size--;
    40. return data;
    41. }
    42. //查看栈顶元素
    43. public int peek(){
    44. if(empty()){
    45. throw new EmptyStackException();
    46. }
    47. return head.val;
    48. }
    49. public void display() {
    50. ListNode cur = this.head;
    51. while (cur != null) {
    52. System.out.print(cur.val+" ");
    53. cur = cur.next;
    54. }
    55. System.out.println();
    56. }
    57. }
  • 相关阅读:
    轻松拿下Offer!20个Salesforce管理员&顾问的基础面试问题
    【Element UI】解决 el-button 禁用状态下,el-tooltip 提示不生效问题
    Programming Abstractions in C阅读笔记:p306-p307
    Consensus-AI论文搜索引擎 直接从论文中找答案
    【EasyRL学习笔记】第十二章 Deep Deterministic Policy Gradient 深度确定性策略梯度(DDPG)算法
    哈夫曼树你需要了解一下
    字符串6——实现 strStr()
    python txt文本特定字符串提取
    比较两个对象相同对象不同值
    PyTorch包的结构总结
  • 原文地址:https://blog.csdn.net/2301_76161469/article/details/133323663