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