Java数据结构--------堆栈和队列

我就是我 2023-10-16 18:39 139阅读 0赞

本章相关介绍:

堆栈和队列都是特殊的线性表。线性表、堆栈和队列三者的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的插入和删除操作不受限制,而堆栈只能在栈顶插入和删除,队列只能在队尾插入,在队头删除。堆栈和队列都可以分别用顺序存储结构和链式存储结构存储。顺序队列通常采用顺序循环队列方法实现,因为顺序循环队列可以避免顺序队列的“假溢出”问题。优先队列是带有优先级的队列。

堆栈

堆栈(也称为栈)是一种特殊的线性表。堆栈的数据元素以及数据元素之间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定的一端进行插入和删除操作。

堆栈中允许进行插入和删除的一端称为栈顶,另一端称为栈底。堆栈的插入操通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈。

根据栈的定义,每次进栈的数据元素都放在原当前栈顶元素之前而成为新的栈顶元素,每次退栈的数据元素都是当前栈顶元素,这样,最后进入堆栈的数据元素总是最先退出堆栈,因此,堆栈也称为后进先出表。

堆栈的抽象数据类型

1、堆栈的数据集合可以表示为a1,a2,a3,a4,a5,每个数据元素的数据类型是任意的类类型。

2、操作集合:

1、入栈操作

2、出栈操作

3、取出栈顶数据元素

4、判断堆栈是否为空

相关源代码:

接口对象

  1. package com.algorithm;
  2. //堆栈接口对象
  3. public interface StackExample {
  4. //入栈操作
  5. public boolean push(Object object);
  6. //出栈操作
  7. public Object pop();
  8. //栈顶元素
  9. public Object getTop();
  10. //堆栈是否为空
  11. public boolean isEmpty();
  12. }

实列化类:

  1. package com.algorithm;
  2. public class StackInstantiation implements StackExample {
  3. //默认栈顶的位置
  4. final int defaultSize=10;
  5. //栈标记
  6. int top;
  7. //堆栈数组
  8. Object[] stack;
  9. //堆栈元素个数
  10. int maxSize;
  11. //相关的构造函数和方法
  12. public void initiate(int size){
  13. maxSize=size;
  14. top=0;
  15. stack=new Object[size];
  16. }
  17. public StackInstantiation() {
  18. initiate(defaultSize);
  19. }
  20. public StackInstantiation(int sz) {
  21. initiate(sz);
  22. }
  23. @Override
  24. public Object getTop() {
  25. // TODO Auto-generated method stub
  26. Object object=null;
  27. if(top==0){
  28. object="404";
  29. }else{
  30. object=stack[top-1];
  31. }
  32. return object;
  33. }
  34. @Override
  35. public boolean isEmpty() {
  36. // TODO Auto-generated method stub
  37. return (top>0);
  38. }
  39. @Override
  40. public Object pop() {
  41. // TODO Auto-generated method stub
  42. Object object=null;
  43. if(top==0){
  44. object="404";
  45. }else{
  46. top--;
  47. object=stack[top];
  48. }
  49. return object;
  50. }
  51. @Override
  52. public boolean push(Object object) {
  53. // TODO Auto-generated method stub
  54. boolean target=false;
  55. if(top==maxSize){
  56. return target;
  57. }else{
  58. target=true;
  59. stack[top]=object;
  60. top++;
  61. return target;
  62. }
  63. }
  64. }

实例化方法

  1. package com.algorithm;
  2. public class StackTest {
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. // TODO Auto-generated method stub
  8. StackInstantiation stack=new StackInstantiation();
  9. //判断堆栈是否为空
  10. boolean target=stack.isEmpty();
  11. System.out.println("堆栈是否为空:"+target);
  12. //堆栈元素添加
  13. stack.push("c");
  14. stack.push("c++");
  15. stack.push("c#");
  16. stack.push("java");
  17. stack.push("object-c");
  18. stack.push("php");
  19. stack.push("ruby");
  20. //堆栈元素添加再次判断堆栈是否为空
  21. boolean targets=stack.isEmpty();
  22. System.out.println("堆栈是否为空:"+targets);
  23. //获取栈顶元素
  24. Object object=stack.getTop();
  25. System.out.println("栈顶元素为:"+object);
  26. //堆栈元素出栈
  27. Object objects=stack.pop();
  28. System.out.println("移除栈顶元素为:"+objects);
  29. //再次获取栈顶元素
  30. Object objects1=stack.getTop();
  31. System.out.println("再次获得的栈顶元素为:"+objects1);
  32. }
  33. }

结果展示:

Center

堆栈———-链式存储结构

源代码:

结点接口

  1. package com.algorithm;
  2. public interface StackNode {
  3. //获取结点数据域
  4. public Object getData();
  5. //设置结点数据域
  6. public void setData(Object obj);
  7. }

堆栈操作接口

  1. package com.algorithm;
  2. //堆栈接口对象
  3. public interface StackExample {
  4. //入栈操作
  5. public boolean push(Object object);
  6. //出栈操作
  7. public Object pop();
  8. //栈顶元素
  9. public Object getTop();
  10. //堆栈是否为空
  11. public boolean isEmpty();
  12. }

结点接口实例化对象

  1. package com.algorithm;
  2. public class SLNode implements StackNode {
  3. private Object element; // 数据成员
  4. private SLNode next; // 指向下一个成员结点
  5. // 两个构造器
  6. public SLNode() {
  7. this(null, null);
  8. }
  9. public SLNode(Object obj, SLNode nextnode) {
  10. this.element = obj;
  11. this.next = nextnode;
  12. }
  13. public Object getElement() {
  14. return element;
  15. }
  16. public void setElement(Object element) {
  17. this.element = element;
  18. }
  19. public SLNode getNext() {
  20. return next;
  21. }
  22. public void setNext(SLNode next) {
  23. this.next = next;
  24. }
  25. public void setData(Object obj) {
  26. element = obj;
  27. }
  28. public Object getData() {
  29. return element;
  30. }
  31. }

核心代码:

  1. package com.algorithm;
  2. //堆栈-----链式存储结构
  3. public class StackLinked implements StackExample {
  4. // 相关属性和方法
  5. private SLNode top; // 链表首结点引用
  6. private int size; // 栈的大小
  7. // 相关构造函数
  8. public StackLinked() {
  9. top = null;
  10. size = 0;
  11. }
  12. // 返回堆栈的大小
  13. public int getSize() {
  14. return size;
  15. }
  16. // 栈顶元素
  17. @Override
  18. public Object getTop() {
  19. // TODO Auto-generated method stub
  20. Object object = null;
  21. if (size < 1) {
  22. object = "404";
  23. return object;
  24. } else {
  25. object = top.getData();
  26. return object;
  27. }
  28. }
  29. // 判断栈顶是否为空
  30. @Override
  31. public boolean isEmpty() {
  32. // TODO Auto-generated method stub
  33. return size == 0;
  34. }
  35. // 元素出栈
  36. @Override
  37. public Object pop() {
  38. // TODO Auto-generated method stub
  39. Object object = null;
  40. if (size < 1) {
  41. object = "404";
  42. return object;
  43. } else {
  44. object = top.getData();
  45. top = top.getNext();
  46. size--;
  47. return object;
  48. }
  49. }
  50. // 数据元素object入栈
  51. @Override
  52. public boolean push(Object object) {
  53. // TODO Auto-generated method stub
  54. SLNode q = new SLNode(object, top);
  55. top = q;
  56. size++;
  57. return true;
  58. }
  59. }

演示结构:

  1. package com.algorithm;
  2. public class StackTest {
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. StackLinked linked=new StackLinked();
  8. //判断堆栈是否为空
  9. boolean target=linked.isEmpty();
  10. System.out.println("堆栈是否为空:"+target);
  11. //堆栈元素添加
  12. linked.push("c");
  13. linked.push("c++");
  14. linked.push("c#");
  15. linked.push("object-c");
  16. linked.push("java");
  17. linked.push("php");
  18. linked.push("ruby");
  19. //堆栈元素添加再次判断堆栈是否为空
  20. boolean targets=linked.isEmpty();
  21. System.out.println("堆栈是否为空:"+targets);
  22. //获取栈顶元素
  23. Object object=linked.getTop();
  24. System.out.println("栈顶元素为:"+object);
  25. //堆栈元素出栈
  26. Object objects=linked.pop();
  27. System.out.println("移除栈顶元素为:"+objects);
  28. //堆栈数据元素个数
  29. int size=linked.getSize();
  30. System.out.println("堆栈元素个数为:"+size);
  31. //再次获取栈顶元素
  32. Object objects1=linked.getTop();
  33. System.out.println("再次获得的栈顶元素为:"+objects1);
  34. }
  35. }

结果展示:

Center 1

发表评论

表情:
评论列表 (有 0 条评论,139人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java数据结构--------堆栈队列

    本章相关介绍: 堆栈和队列都是特殊的线性表。线性表、堆栈和队列三者的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的插入和删除操作不受限制,而堆栈只能在栈顶插入和删除

    相关 数据结构堆栈队列

    堆栈与队列是两种重要的基础数据结构,一个是先入后出,一个是先入先出,有着广泛的应用,本文分别使用数组与链表实现堆栈与队列 顺序存储方式实现堆栈 define

    相关 数据结构——堆栈队列

    堆栈和队列都是特殊的线性表,线性表、堆栈和队列三者的数据元素以及数据元素之间的逻辑关系完全相同。 差别:线性表的插入和删除操作不受任何限制,而堆栈只能在栈顶插入和删除,队列

    相关 数据结构--堆栈(Java版)

    一、栈的介绍 > 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入