0


栈的轻松使用及手把手实现栈

这里写目录标题

栈的概念与特点

  • 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
  • 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
  • 出栈:栈的删除操作叫做出栈。出数据也在栈顶

如图所示:
在这里插入图片描述
这里的 1 2 3 4 就是压入栈中的元素,新压入的元素放在栈顶,比如说压入新的元素:5 。那么就是这样的:
在这里插入图片描述
出栈也是从栈顶往外出。

栈的使用

栈的功能有:压栈,出栈,比较栈顶元素,判空,栈的比较等等。

压栈

通过 push 来进行栈的压入:

publicstaticvoidmain(String[] args){java.util.Stack<Integer> stack =newjava.util.Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);System.out.println(stack);}

运行结果如下:
在这里插入图片描述

出栈

通过 pop 方法来出栈:

publicstaticvoidmain(String[] args){java.util.Stack<Integer> stack =newjava.util.Stack<>();
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);System.out.println(stack);
    stack.pop();
    stack.pop();System.out.println(stack);}

运行结果如下:
在这里插入图片描述

求得栈顶元素

通过 peek 方法来得到:

publicstaticvoidmain(String[] args){java.util.Stack<Integer> stack =newjava.util.Stack<>();
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);System.out.println(stack.peek());System.out.println(stack);}

运行结果如下:
在这里插入图片描述
使用 peek 的时候,只是获得栈顶元素。

判断栈是否为空

通过 isEmpty 来判断:

publicstaticvoidmain(String[] args){java.util.Stack<Integer> stack =newjava.util.Stack<>();
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);System.out.println(stack.isEmpty());}

在这里插入图片描述

栈的比较

通过 equals 来比较是否相等:

publicstaticvoidmain(String[] args){java.util.Stack<Integer> stack =newjava.util.Stack<>();java.util.Stack<Integer> stack1 =newjava.util.Stack<>();
    stack.push(1);
    stack.push(2);
    stack1.push(1);
    stack1.push(2);System.out.println(stack.equals(stack1));}

运行结果如下:
在这里插入图片描述

手把手实现栈

因为栈的特点是先进后出,后进先出。而且入栈和出栈的时间复杂度都是 O(1) ,所以我们选用顺序表来实现栈。

写出顺序表

先写出代码的初始部分:

publicint[] elem;publicint usedSize;publicMyStack(){this.elem =newint[5];}

这里实现了顺序表的内容,也就是自己实现的栈。

判断是否满了

通过直接比较使用空间大小和数组大小就可以知道有没有满:

publicbooleanisFull(){returnthis.usedSize ==this.elem.length;}

压栈

压栈也就是直接放入元素,在放入元素的时候要先判断满没满,如果满了就扩容,没满就直接放在 usedSize 位置就可以了:

publicvoidpush(int val){if(isFull()){this.elem =Arrays.copyOf(this.elem,2*this.elem.length);}this.elem[this.usedSize]= val;this.usedSize++;}

判断是否为空

通过判断 usedSize 是否为 0 来完成判断:

publicbooleanisEmpty(){returnthis.usedSize ==0;}

出栈

在出栈的时候,先判断是否为空,如果是空的话,就扔出栈为空的异常,不是的话先保存 usedSize -1 位置的值。然后 usedSize-- ,最后再返回 usedSize -1 位置的值就可以了。

publicintpop(){if((isEmpty())){thrownewRuntimeException("栈为空!");}int oldVal =this.elem[this.usedSize-1];this.usedSize--;return  oldVal;}

比较栈顶元素

第一步还是先判断栈是否为空。如果不是的话,就返回 usedSize -1 位置的值就好了。

publicintpeek(){if((isEmpty())){thrownewRuntimeException("栈为空!");}returnthis.elem[this.usedSize-1];}

栈的大小

通过返回 usedSize 的大小就知道栈的大小了。

publicintsize(){returnthis.usedSize;}

测试

测试上述功能:

publicstaticvoidmain(String[] args){MyStack stack =newMyStack();
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);
    stack.push(5);
    stack.push(6);
    stack.push(7);System.out.println(stack.size());
    stack.pop();
    stack.pop();System.out.println(stack.peek());System.out.println(stack.isEmpty());}

运行结果如下:
在这里插入图片描述


本文转载自: https://blog.csdn.net/sjp151/article/details/122751610
版权归原作者 Lockey-s 所有, 如有侵权,请联系我们删除。

“栈的轻松使用及手把手实现栈”的评论:

还没有评论