栈的顺序结构和链式结构实现

Posted Mr.Zhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的顺序结构和链式结构实现相关的知识,希望对你有一定的参考价值。

1.栈的顺序存储<数组实现>

1.1.栈的接口

 1 package com.neusoft.stack;
 2 
 3 public interface IStack {
 4     //1.栈置空
 5     public void clear();
 6     //2.栈判空
 7     public boolean isEmpty();
 8     //3.栈长度
 9     public int length();
10     //4.取栈顶元素
11     public Object peek();
12     //5.移除栈顶元素-----出栈
13     public Object pop();
14     //6.入栈
15     public void push(Object x);
16     //7.打印栈元素
17     public void display();
18 }

点击复制代码

 1 package com.neusoft.stack;
 2 
 3 public interface IStack {
 4     //1.栈置空
 5     public void clear();
 6     //2.栈判空
 7     public boolean isEmpty();
 8     //3.栈长度
 9     public int length();
10     //4.取栈顶元素
11     public Object peek();
12     //5.移除栈顶元素-----出栈
13     public Object pop();
14     //6.入栈
15     public void push(Object x);
16     //7.打印栈元素
17     public void display();
18 }
点击+展开代码

1.2 栈的顺序存储类

 1 package com.neusoft.stack;
 2 
 3 public class SqStack implements IStack {
 4     private Object[] stackElem;
 5     //非空栈中始终表示栈顶元素的下一个位置,当栈为空的时候其值为0
 6     public int top;
 7     public SqStack(int maxSize) {
 8         // TODO 初始化栈
 9         top=0;
10         stackElem=new Object[maxSize];
11     }
12     @Override
13     public void clear() {
14         // TODO 栈置空
15         top=0;
16     }
17     @Override
18     public boolean isEmpty() {
19         // TODO 栈判空
20         return top==0;
21     }
22     @Override
23     public int length() {
24         // TODO 栈长度
25         return top;
26     }
27     @Override
28     public Object peek() {
29         // TODO 查看栈顶元素对象而不移除,返回栈顶元素
30         if (!isEmpty()) {
31             //返回镇定元素
32             return stackElem[top-1];
33         }
34         else {
35             //栈为空
36             return null;
37         }
38     }
39 
40     @Override
41     public Object pop() {
42         // TODO 出栈操作
43         if (top==0) {
44             return null;
45         }else {//栈非空
46             return stackElem[--top];
47         }
48     }
49     @Override
50     public void push(Object elem) {
51         // TODO 入栈
52         if (top==stackElem.length) {
53             System.out.println("栈满~");
54         }else {//栈未满
55             stackElem[top++]=elem;
56         }
57     }
58 
59     @Override
60     public void display() {
61         // TODO 显示
62         for (int i=top-1;i>=0;i-- ) {
63             System.out.print(stackElem[i].toString()+" ");
64         }
65         System.out.println();
66     }
67 
68 }

点击复制代码

 1 package com.neusoft.stack;
 2 
 3 public class SqStack implements IStack {
 4     private Object[] stackElem;
 5     //非空栈中始终表示栈顶元素的下一个位置,当栈为空的时候其值为0
 6     public int top;
 7     public SqStack(int maxSize) {
 8         // TODO 初始化栈
 9         top=0;
10         stackElem=new Object[maxSize];
11     }
12     @Override
13     public void clear() {
14         // TODO 栈置空
15         top=0;
16     }
17     @Override
18     public boolean isEmpty() {
19         // TODO 栈判空
20         return top==0;
21     }
22     @Override
23     public int length() {
24         // TODO 栈长度
25         return top;
26     }
27     @Override
28     public Object peek() {
29         // TODO 查看栈顶元素对象而不移除,返回栈顶元素
30         if (!isEmpty()) {
31             //返回镇定元素
32             return stackElem[top-1];
33         }
34         else {
35             //栈为空
36             return null;
37         }
38     }
39 
40     @Override
41     public Object pop() {
42         // TODO 出栈操作
43         if (top==0) {
44             return null;
45         }else {//栈非空
46             return stackElem[--top];
47         }
48     }
49     @Override
50     public void push(Object elem) {
51         // TODO 入栈
52         if (top==stackElem.length) {
53             System.out.println("栈满~");
54         }else {//栈未满
55             stackElem[top++]=elem;
56         }
57     }
58 
59     @Override
60     public void display() {
61         // TODO 显示
62         for (int i=top-1;i>=0;i-- ) {
63             System.out.print(stackElem[i].toString()+" ");
64         }
65         System.out.println();
66     }
67 
68 }
点击+展开

1.3.栈的顺序存储测试类

 1 package com.neusoft.stack;
 2 //测试顺序结构的栈
 3 public class DebugSqStack {
 4     public static void main(String[] args) {
 5         //------初始化栈------------
 6         SqStack S = new SqStack(100);
 7         //-----入栈(添加元素)--------
 8         for (int i = 0; i < 10; i++) {
 9             S.push(i);
10         }
11         //----输出栈中的元素---------
12         System.out.println("栈中个元素为:");
13         S.display();
14         //----判断栈空--------------
15         if (!S.isEmpty()) {
16             System.out.println("栈不是空的~");
17         }
18         //---栈长度------------------
19         System.out.println("栈的长度为:"+S.length());
20         //---输出栈顶元素-------------
21         System.out.println("栈顶元素为:"+S.peek().toString());
22         //-----测试取出栈顶元素后的输出---------------
23         S.pop();
24         S.display();
25         //-----去除栈中的所有元素------------------
26         System.out.println("去除所有栈中的元素");
27         S.clear();
28         if (S.isEmpty()) {
29             System.out.println("栈已经清空~");
30         }
31     }
32 }

点击复制代码

 1 package com.neusoft.stack;
 2 //测试顺序结构的栈
 3 public class DebugSqStack {
 4     public static void main(String[] args) {
 5         //------初始化栈------------
 6         SqStack S = new SqStack(100);
 7         //-----入栈(添加元素)--------
 8         for (int i = 0; i < 10; i++) {
 9             S.push(i);
10         }
11         //----输出栈中的元素---------
12         System.out.println("栈中个元素为:");
13         S.display();
14         //----判断栈空--------------
15         if (!S.isEmpty()) {
16             System.out.println("栈不是空的~");
17         }
18         //---栈长度------------------
19         System.out.println("栈的长度为:"+S.length());
20         //---输出栈顶元素-------------
21         System.out.println("栈顶元素为:"+S.peek().toString());
22         //-----测试取出栈顶元素后的输出---------------
23         S.pop();
24         S.display();
25         //-----去除栈中的所有元素------------------
26         System.out.println("去除所有栈中的元素");
27         S.clear();
28         if (S.isEmpty()) {
29             System.out.println("栈已经清空~");
30         }
31     }
32 }
点击+展开代码

1.4 测试类

      

 

2.栈的链式存储结构(链栈)

2.1 IStack接口声明

 1 package com.neusoft.stack;
 2 
 3 public interface IStack {
 4     //1.栈置空
 5     public void clear();
 6     //2.栈判空
 7     public boolean isEmpty();
 8     //3.栈长度
 9     public int length();
10     //4.取栈顶元素
11     public Object peek();
12     //5.移除栈顶元素-----出栈
13     public Object pop();
14     //6.入栈
15     public void push(Object x);
16     //7.打印栈元素
17     public void display();
18 }

点击复制代码

 1 package com.neusoft.stack;
 2 
 3 public interface IStack {
 4     //1.栈置空
 5     public void clear();
 6     //2.栈判空
 7     public boolean isEmpty();
 8     //3.栈长度
 9     public int length();
10     //4.取栈顶元素
11     public Object peek();
12     //5.移除栈顶元素-----出栈
13     public Object pop();
14     //6.入栈
15     public void push(Object x);
16     //7.打印栈元素
17     public void display();
18 }
点击+复制代码

2.2 Node节点声明

 1 package com.neusoft.stack;
 2 
 3 public class Node {
 4     public Object data;// 数据域
 5     public Node next;// 指针域
 6     public Node() { //构造空节点
 7         this(null,null);
 8     }
 9     public Node(Object data){//构造有一个参数的数据域
10         this(data,null);
11     }
12     public Node(Object data,Node node){//构造数据域和指针域
13         this.data=data;
14         this.next=node;
15     }
16 }

点击复制代码

 1 package com.neusoft.stack;
 2 
 3 public class Node {
 4     public Object data;// 数据域
 5     public Node next;// 指针域
 6     public Node() { //构造空节点
 7         this(null,null);
 8     }
 9     public Node(Object data){//构造有一个参数的数据域
10         this(data,null);
11     }
12     public Node(Object data,Node node){//构造数据域和指针域
13         this.data=data;
14         this.next=node;
15     }
16 }
点击+展开代码

2.3 链栈的实现类

 1 package com.neusoft.stack;
 2 public class LinkStack implements IStack {
 3     private Node top;//栈顶元素的引用
 4     @Override
 5     public void clear() {
 6         // TODO 链栈置空
 7         top=null;
 8     }
 9 
10     @Override
11     public boolean isEmpty() {
12         // TODO 判空
13         return top== null;
14     }
15 
16     @Override
17     public int length() {
18         // TODO 长度
19         Node p =top;//p指针指向栈顶元素
20         int length=0;
21         while (p!=null) {
22             p=p.next;//指向后继节点
23             length++;
24         }
25         return length;
26     }
27 
28     @Override
29     public Object peek() {
30         // TODO 查找栈顶元素而不移除
31         if (!isEmpty()) {
32             return top.data;//栈顶元素
33         }else {
34             return null;
35         }
36     }
37     @Override
38     public Object pop() {
39         // TODO 出栈,返回出栈的元素
40         if (!isEmpty()) {
41             Node p=top;//将要删除的元素用p指针暂存
42             top=top.next;
43             return p.data;
44         }else{
45             return null;
46         }
47     }
48     @Override
49     public void push(Object x) {
50         // TODO 入栈
51         Node p=new Node(x);//构造一个新节点
52         p.next=top;
53         top=p;
54     }
55 
56     @Override
57     public void display() {
58         // TODO 显示数据
59         Node p=top;
60         while(p!=null){
61             System.out.print(p.data.toString()+" ");
62             p=p.next;
63         }
64         System.out.println();
65     }
66 
67 }

点击复制代码

 1 package com.neusoft.stack;
 2 public class LinkStack implements IStack {
 3     private Node top;//栈顶元素的引用
 4     @Override
 5     public void clear() {
 6         // TODO 链栈置空
 7         top=null;
 8     }
 9 
10     @Override
11     public boolean isEmpty() {
12         // TODO 判空
13         

以上是关于栈的顺序结构和链式结构实现的主要内容,如果未能解决你的问题,请参考以下文章

栈的顺序结构和链式结构实现

数据结构学习笔记——链式存储结构实现栈

数据结构——顺序栈和链式栈的简单实现和解析(C语言版)

数据结构学习笔记——链式存储结构实现栈(链栈)

数据结构&算法08-栈概念&源码

C/C++数据结构-完整代码栈(栈的顺序存储,栈的链式存储,就近匹配,中缀表达式和后缀表达式)