JAVA实现栈结构

  • 栈结构特点是在栈顶位置进行元素的增加(入栈)和删除(出栈),栈的底层结构使用的也是数组

  1. /**
  2. * 栈的代码实现,应用:波兰中序表达式转后序表达式,并求出表达式的值
  3. *
  4. * @author timmy1 栈的元素操作只在一端(栈顶位置),进行插入和删除-》包含的操作有:元素插入到栈顶push, 删除栈顶元素pop,
  5. * 获取栈顶元素peek,搜索元素的位置
  6. */
  7. public class MyStack<E> {
  8. private int size;
  9. private int modSize;
  10. private Object[] array;// 栈的底层结构为数组
  11. private int DEFAULT_CAPACITY = 10;
  12. public MyStack() {
  13. array = new Object[DEFAULT_CAPACITY];
  14. }
  15. /**
  16. * 入栈-- 栈顶位置插入元素,即是数组最后的位置
  17. *
  18. * @param e
  19. * @return
  20. */
  21. public boolean push(E e) {
  22. array = judgeIsGrow();
  23. array[size] = e;
  24. size++;
  25. modSize++;
  26. return true;
  27. }
  28. // 判断数组长度是否需要扩容
  29. private Object[] judgeIsGrow() {
  30. if (array.length == size) {
  31. int newSize = size < Integer.MAX_VALUE / 2 ? size * 2 : Integer.MAX_VALUE;
  32. Object[] newArray = new Object[newSize];
  33. System.arraycopy(array, 0, newArray, 0, size);
  34. array = newArray;
  35. }
  36. return array;
  37. }
  38. /**
  39. * 出栈-- 删除栈顶元素
  40. *
  41. * @return
  42. */
  43. public boolean pop() {
  44. if (size == 0) {
  45. throw new IndexOutOfBoundsException("当前栈元素为空");
  46. }
  47. array[size - 1] = null;
  48. size--;
  49. modSize++;
  50. return true;
  51. }
  52. /**
  53. * 获取栈顶元素
  54. *
  55. * @return
  56. */
  57. @SuppressWarnings("unchecked")
  58. public E peek() {
  59. if (size == 0)
  60. return null;
  61. E obj = (E) array[size - 1];
  62. modSize++;
  63. return obj;
  64. }
  65. /**
  66. * 搜索元素e的位置
  67. *
  68. * @param e
  69. * @return
  70. */
  71. public int search(E e) {
  72. if (e == null) {
  73. for (int i = size - 1; i >= 0; i--) {
  74. if (array[i] == null) {
  75. return size - 1 - i;
  76. }
  77. }
  78. } else {
  79. for (int i = size - 1; i >= 0; i--) {
  80. if (array[i].equals(e)) {
  81. return size - 1 - i;
  82. }
  83. }
  84. }
  85. return -1;
  86. }
  87. public int size() {
  88. return size;
  89. }
  90. public static void main(String[] args) {
  91. MyStack<String> myStack = new MyStack<>();
  92. for (int i = 0; i < 5; i++) {
  93. myStack.push("data " + i);
  94. }
  95. System.out.println("搜索 " + myStack.search("data 4"));
  96. int size = myStack.size();
  97. for (int i = 0; i < size; i++) {
  98. String data = myStack.peek();
  99. System.out.println(data);
  100. myStack.pop();
  101. }
  102. }
  103. }

结果打印:

搜索 0

data 4

data 3

data 2

data 1

data 0




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值