当前位置:   article > 正文

【数据结构】Java实现栈_java栈的实现

java栈的实现

目录

1. 概念

2. 栈的使用 

3. 自己动手实现栈(使用动态数组实现栈) 

1. 创建一个MyStack类

2. push入栈

3. pop出栈

4. 查看栈顶元素

5. 判断栈是否为空与获取栈长

6. toString方法

4. 整体实现

4.1 MyStack类

4.2 Test类

4.3 测试结果


1. 概念

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

2. 栈的使用 

  1. public static void main(String[] args) {
  2. Stack<Integer> stack = new Stack<>();
  3. // 将e入栈,并返回e
  4. stack.push(1);
  5. stack.push(2);
  6. stack.push(3);
  7. stack.push(4);
  8. stack.push(5);
  9. // 将栈顶元素出栈并返回
  10. System.out.println(stack.pop());
  11. // 获取栈顶元素
  12. System.out.println(stack.peek());
  13. // 检测栈是否为空
  14. System.out.println(stack.empty());
  15. // 获取栈中有效元素个数
  16. System.out.println(stack.size());
  17. System.out.println(stack);
  18. }

3. 自己动手实现栈(使用动态数组实现栈) 

1. 创建一个MyStack类

思路图:

  1. import java.util.Arrays;
  2. import java.util.NoSuchElementException;
  3. //使用泛型
  4. public class MyStack<E> {
  5. private Object[] data;
  6. private int size;
  7. public MyStack(int capacity){
  8. this.data = new Object[capacity];
  9. }
  10. public MyStack(){
  11. this.data = new Object[10];
  12. }
  13. }

2. push入栈

  1. public E push(E val){
  2. data[size ++] = val;
  3. if(size == data.length){
  4. data = Arrays.copyOf(data,data.length<<1);
  5. }
  6. return val;
  7. }

3. pop出栈

  1. public E pop(){
  2. if (isEmpty()){
  3. throw new NoSuchElementException("stack is empy,cannot pop!");
  4. }
  5. E oldVal = (E)data[size - 1];
  6. size --;
  7. return oldVal;
  8. }

4. 查看栈顶元素

  1. public E peek(){
  2. if (isEmpty()){
  3. throw new NoSuchElementException("stack is empy,cannot peek!");
  4. }
  5. return (E)data[size - 1];
  6. }

5. 判断栈是否为空与获取栈长

  1. public boolean isEmpty() {
  2. return size == 0;
  3. }
  4. public int size(){
  5. return size;
  6. }

6. toString方法

  1. public String toString() {
  2. StringBuilder sb = new StringBuilder();
  3. sb.append("bottom [");
  4. for (int i = 0; i < size; i++) {
  5. sb.append(data[i]);
  6. if(i < size - 1){
  7. sb.append(",");
  8. }
  9. }
  10. sb.append("] top");
  11. return sb.toString();
  12. }

4. 整体实现

4.1 MyStack类

  1. package seqlist.stack_queue;
  2. import java.util.Arrays;
  3. import java.util.NoSuchElementException;
  4. public class MyStack<E> {
  5. private Object[] data;
  6. private int size;
  7. public MyStack(int capacity){
  8. this.data = new Object[capacity];
  9. }
  10. public MyStack(){
  11. this.data = new Object[10];
  12. }
  13. public E push(E val){
  14. data[size ++] = val;
  15. if(size == data.length){
  16. data = Arrays.copyOf(data,data.length<<1);
  17. }
  18. return val;
  19. }
  20. public boolean isEmpty() {
  21. return size == 0;
  22. }
  23. public int size(){
  24. return size;
  25. }
  26. public E pop(){
  27. if (isEmpty()){
  28. throw new NoSuchElementException("stack is empy,cannot pop!");
  29. }
  30. E oldVal = (E)data[size - 1];
  31. size --;
  32. return oldVal;
  33. }
  34. public E peek(){
  35. if (isEmpty()){
  36. throw new NoSuchElementException("stack is empy,cannot peek!");
  37. }
  38. return (E)data[size - 1];
  39. }
  40. @Override
  41. public String toString() {
  42. StringBuilder sb = new StringBuilder();
  43. sb.append("bottom [");
  44. for (int i = 0; i < size; i++) {
  45. sb.append(data[i]);
  46. if(i < size - 1){
  47. sb.append(",");
  48. }
  49. }
  50. sb.append("] top");
  51. return sb.toString();
  52. }
  53. }

4.2 Test类

  1. public static void main(String[] args) {
  2. MyStack<Integer> stack = new MyStack<>();
  3. // 将e入栈,并返回e
  4. stack.push(1);
  5. stack.push(2);
  6. stack.push(3);
  7. stack.push(4);
  8. stack.push(5);
  9. System.out.println("将栈顶元素出栈并返回");
  10. System.out.println(stack.pop());
  11. System.out.println("获取栈顶元素");
  12. System.out.println(stack.peek());
  13. System.out.println("检测栈是否为空");
  14. System.out.println(stack.isEmpty());
  15. System.out.println("获取栈中有效元素个数");
  16. System.out.println(stack.size());
  17. System.out.println(stack);
  18. }

4.3 测试结果

 【例题】一个栈的入栈序列为ABCDE,则不可能的出栈序列为( )

        A. ABCDE

        B. EDCBA

        C. DCEBA

        D. ECDBA

稳妥的做法是画图逐个选项检测,大概率是不会出错的,

如果是E先出,说明ABCDE都已经全部入栈,E出栈之后,此时栈顶元素是D,如果再要出栈应该是D,而不应该是C。故应该选择D。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/611829
推荐阅读
相关标签
  

闽ICP备14008679号