数据结构--栈的实现(顺序栈和链栈)

谁践踏了优雅 2021-08-14 00:41 577阅读 0赞

栈(stack)是一种特殊的线性表,其插入和删除操作只允许在线性表的一端进行。

在这里插入图片描述

栈的抽象数据类型

  1. package pers.zhang.stack;
  2. /** * @author zhang * @date 2020/1/16 - 14:05 * * 栈接口,描述栈的抽象数据类型,泛型参数T表示数据元素的数据类型 */
  3. public interface SStack<T> {
  4. //判断栈是否为空
  5. boolean isEmpty();
  6. //元素x入栈
  7. void push(T x);
  8. //出栈,返回栈顶元素
  9. T pop();
  10. //取出栈顶元素,未出栈
  11. T get();
  12. }

栈的实现

栈有两种基本的实现:

  • 顺序栈:使用数组实现
  • 链栈:使用栈节点实现

在这里插入图片描述

顺序栈

在这里插入图片描述

  1. package pers.zhang.stack;
  2. /** * @author zhang * @date 2020/1/16 - 14:12 * * 顺序栈,实现栈接口 */
  3. public class SeqStack<T> implements SStack<T> {
  4. //存储栈数据元素的Object数组
  5. private Object element[];
  6. //栈顶元素下表
  7. private int top;
  8. //构造容量为size的栈
  9. public SeqStack(int size){
  10. this.element = new Object[Math.abs(size)];
  11. this.top = -1;
  12. }
  13. //默认构造,构造容量为64的空栈
  14. public SeqStack(){
  15. this(64);
  16. }
  17. //判断栈是否为空,若为空返回true
  18. @Override
  19. public boolean isEmpty() {
  20. return this.top == -1;
  21. }
  22. //元素x入栈,空对象不操作
  23. @Override
  24. public void push(T x) {
  25. if(x == null)
  26. return;
  27. if(this.top == element.length - 1){ //栈满,需要扩容
  28. Object[] temp = this.element;
  29. this.element = new Object[temp.length * 2];//重新申请一个2倍容量的数组
  30. for(int i = 0; i < temp.length; i++)//复制元素
  31. this.element[i] = temp[i];
  32. }
  33. this.top++;//移动栈顶指针
  34. this.element[this.top] = x;//入栈
  35. }
  36. //出栈,返回栈顶元素,若栈空返回null
  37. @Override
  38. public T pop() {
  39. return this.top == -1 ? null : (T) this.element[this.top--];
  40. }
  41. //取出栈顶元素,未出栈,若栈空返回null
  42. @Override
  43. public T get() {
  44. return this.top == -1 ? null : (T) this.element[this.top];
  45. }
  46. //返回栈所有元素的描述字符串,形式为“(,)”,算法同顺序表
  47. @Override
  48. public String toString(){
  49. String str = "(";
  50. if (this.top != -1)
  51. str += this.element[this.top].toString();
  52. for (int i= this.top - 1; i >= 0; i--)
  53. str += ", "+this.element[i].toString();
  54. return str + ") ";
  55. }
  56. }

链栈

在这里插入图片描述
在这里插入图片描述

节点类:

  1. public class Node<T> {
  2. //数据域,保存数据元素
  3. public T data;
  4. //地址域,引用后继节点
  5. public Node<T> next;
  6. public Node(){
  7. this(null,null);
  8. }
  9. public Node(T data, Node<T> next){
  10. this.data = data;
  11. this.next = next;
  12. }
  13. public String toString(){
  14. return this.data.toString();
  15. }
  16. public boolean equals(Object obj){
  17. return obj == this || obj instanceof Node && this.data.equals(((Node<T>)obj).data);
  18. }
  19. }

链栈的实现:

  1. package pers.zhang.stack;
  2. import pers.zhang.linearList.LinearList;
  3. import pers.zhang.linearList.Node;
  4. /** * @author zhang * @date 2020/1/16 - 14:28 * * 链栈,实现栈接口 */
  5. public class LinkedStack<T> implements SStack<T> {
  6. //栈顶节点,同单链表节点一致
  7. private Node<T> top;
  8. //构造空栈
  9. public LinkedStack(){
  10. this.top = null;
  11. }
  12. //判断栈是否为空,若空返回true
  13. @Override
  14. public boolean isEmpty() {
  15. return this.top == null;
  16. }
  17. //元素x入栈,空对象不操作
  18. @Override
  19. public void push(T x) {
  20. if(x == null)
  21. return;
  22. this.top = new Node<>(x, this.top);//头插入,x节点作为新的栈顶
  23. }
  24. //出栈,返回栈顶元素,栈空返回null
  25. @Override
  26. public T pop() {
  27. if(this.top == null)
  28. return null;
  29. T temp = this.top.data;//保存栈顶节点元素
  30. this.top = this.top.next;//删除栈顶节点
  31. return temp;
  32. }
  33. //取出栈顶元素,未出栈,空栈返回null
  34. @Override
  35. public T get() {
  36. return this.top == null ? null : this.top.data;
  37. }
  38. //返回栈所有元素的描述字符串,形式为“(,)”。算法同不带头结点的单链表
  39. public String toString(){
  40. String str = "(";
  41. for (Node<T> p = this.top; p != null; p = p.next){
  42. str += p.data.toString();
  43. if (p.next != null)
  44. str += ", ";//不是最后一个结点时后加分隔符
  45. }
  46. return str + ")";//空表返回()
  47. }
  48. }

测试

  1. package pers.zhang.stack;
  2. /** * @author zhang * @date 2020/1/16 - 14:36 */
  3. public class Stack_ex {
  4. public static void main(String args[])
  5. {
  6. /* SeqStack<String> stack = new SeqStack<String>(20); System.out.print("Push: "); char ch='a'; for(int i=0;i<5;i++) { String str = (char)(ch+i)+""; stack.push(str); System.out.print(str+" "); } */
  7. LinkedStack<Integer> stack = new LinkedStack<Integer>();
  8. System.out.print("Push: ");
  9. for (int i=1; i<=5; i++)
  10. {
  11. Integer intobj = new Integer(i);
  12. stack.push(intobj);
  13. System.out.print(intobj+" ");
  14. }
  15. System.out.println("\nStack: "+stack.toString());
  16. System.out.print("Pop : ");
  17. while(!stack.isEmpty()) //全部出栈
  18. System.out.print(stack.pop().toString()+" ");
  19. System.out.println();
  20. }
  21. }

输出如下:

  1. Push: a b c d e
  2. Stack: (e, d, c, b, a)
  3. Pop : e d c b a
  4. Push: 1 2 3 4 5
  5. Stack: (5, 4, 3, 2, 1)
  6. Pop : 5 4 3 2 1

发表评论

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

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

相关阅读