当前位置:   article > 正文

线性表——栈

线性表——栈

一.概述

存储货物或供旅客住宿的地方 , 可引申为仓库、中转站 。例如我们现在生活中的酒店,在古时候叫客栈,是供旅客休息的地方,旅客可以进客栈休息,休息完毕后就离开客栈。
我们把生活中的栈的概念引入到计算机中,就是供数据休息的地方,它是一种数据结构,数据既可以进入到栈中,又可以从栈中出去。
栈是一种基于先进后出 (FILO) 的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
我们称数据进入到栈的动作为 压栈 ,数据从栈中出去的动作为 弹栈

 

二.栈的实现

1.栈API设计

2.代码实现

基本API:

  1. /**
  2. * 因为栈是一种先进后出的数据结构,所以我们可以使用链表来实现栈,也可以用数组来实现栈
  3. * 这边是用链表对栈进行实现;
  4. * @param <T>
  5. */
  6. public class Stack<T> implements Iterable<T>{
  7. //头结点
  8. private Node head;
  9. //记录长度
  10. private int N;
  11. //结点类
  12. private class Node{
  13. //存储元素
  14. public T item;
  15. //指向下一个节点
  16. public Node next;
  17. //构造方法
  18. public Node(T item,Node next){
  19. this.item=item;
  20. this.next=next;
  21. }
  22. }
  23. /**
  24. * 构造方法,初始化栈;
  25. */
  26. public Stack(){
  27. //初始化头结点
  28. this.head=new Node(null,null);
  29. //初始化长度
  30. this.N=0;
  31. }
  32. }
  33. /**
  34. * 判断当前栈中元素个数是否为0
  35. */
  36. public boolean isEmpty(){
  37. return N==0;
  38. }
  39. /**
  40. * 判断长度
  41. */
  42. public int getLength(){
  43. return N;
  44. }
  45. @Override
  46. public Iterator<T> iterator() {
  47. return new SIterator();
  48. }
  49. private class SIterator implements Iterator<T>{
  50. private Node n = head;
  51. @Override
  52. public boolean hasNext() {
  53. return n.next!=null;
  54. }
  55. @Override
  56. public T next() {
  57. Node node = n.next;
  58. n = n.next;
  59. return node.item;
  60. }

把t元素压入栈:

  1. /**
  2. * 把t元素压入栈
  3. */
  4. public void push(T t){
  5. if (head.next==null){
  6. Node oldNode = new Node(t, null);
  7. head.next=oldNode;
  8. N++;
  9. }else {
  10. Node oldNode = head.next;
  11. Node newNode = new Node(t, null);
  12. head.next = newNode;
  13. newNode.next=oldNode;
  14. N++;
  15. }

弹出栈顶元素:

  1. //弹出栈顶元素
  2. public T pop() {
  3. if(N==0){
  4. System.out.println("栈内尚无元素,删除失败");
  5. }
  6. if(N==1){
  7. Node temporaryNode = new Node(head.next.item, null);
  8. head.next = null;
  9. N--;
  10. return temporaryNode.item;
  11. }
  12. if(N!=0 && N!=1){
  13. Node firstNode = head.next;
  14. Node secondNode = firstNode.next;
  15. head.next=secondNode;
  16. N--;
  17. return firstNode.item;
  18. }
  19. return (T) "弹栈成功";
  20. }

3.测试代码

  1. public class stackTest {
  2. public static void main(String[] args) throws Exception {
  3. Stack<String> stack = new Stack();
  4. stack.push("张三");
  5. stack.push("李四");
  6. for (String s : stack) {
  7. System.out.println(s);
  8. }
  9. System.out.println(stack.isEmpty());
  10. System.out.println(stack.getLength());
  11. System.out.println(stack.pop());
  12. System.out.println(stack.getLength());
  13. System.out.println(stack.pop());
  14. System.out.println(stack.getLength());
  15. System.out.println(stack.isEmpty());
  16. }
  17. }

总结:本文介绍了常见数据类型栈在Java中的实现。

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

闽ICP备14008679号