博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构--栈的实现(顺序栈和链栈)
阅读量:2443 次
发布时间:2019-05-10

本文共 4868 字,大约阅读时间需要 16 分钟。

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

在这里插入图片描述

栈的抽象数据类型

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

栈的实现

栈有两种基本的实现:

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

在这里插入图片描述

顺序栈

在这里插入图片描述

package pers.zhang.stack;/** * @author zhang * @date 2020/1/16 - 14:12 * * 顺序栈,实现栈接口 */public class SeqStack
implements SStack
{
//存储栈数据元素的Object数组 private Object element[]; //栈顶元素下表 private int top; //构造容量为size的栈 public SeqStack(int size){
this.element = new Object[Math.abs(size)]; this.top = -1; } //默认构造,构造容量为64的空栈 public SeqStack(){
this(64); } //判断栈是否为空,若为空返回true @Override public boolean isEmpty() {
return this.top == -1; } //元素x入栈,空对象不操作 @Override public void push(T x) {
if(x == null) return; if(this.top == element.length - 1){
//栈满,需要扩容 Object[] temp = this.element; this.element = new Object[temp.length * 2];//重新申请一个2倍容量的数组 for(int i = 0; i < temp.length; i++)//复制元素 this.element[i] = temp[i]; } this.top++;//移动栈顶指针 this.element[this.top] = x;//入栈 } //出栈,返回栈顶元素,若栈空返回null @Override public T pop() {
return this.top == -1 ? null : (T) this.element[this.top--]; } //取出栈顶元素,未出栈,若栈空返回null @Override public T get() {
return this.top == -1 ? null : (T) this.element[this.top]; } //返回栈所有元素的描述字符串,形式为“(,)”,算法同顺序表 @Override public String toString(){
String str = "("; if (this.top != -1) str += this.element[this.top].toString(); for (int i= this.top - 1; i >= 0; i--) str += ", "+this.element[i].toString(); return str + ") "; }}

链栈

在这里插入图片描述

在这里插入图片描述

节点类:

public class Node
{
//数据域,保存数据元素 public T data; //地址域,引用后继节点 public Node
next; public Node(){
this(null,null); } public Node(T data, Node
next){
this.data = data; this.next = next; } public String toString(){
return this.data.toString(); } public boolean equals(Object obj){
return obj == this || obj instanceof Node && this.data.equals(((Node
)obj).data); }}

链栈的实现:

package pers.zhang.stack;import pers.zhang.linearList.LinearList;import pers.zhang.linearList.Node;/** * @author zhang * @date 2020/1/16 - 14:28 * * 链栈,实现栈接口 */public class LinkedStack
implements SStack
{
//栈顶节点,同单链表节点一致 private Node
top; //构造空栈 public LinkedStack(){
this.top = null; } //判断栈是否为空,若空返回true @Override public boolean isEmpty() {
return this.top == null; } //元素x入栈,空对象不操作 @Override public void push(T x) {
if(x == null) return; this.top = new Node<>(x, this.top);//头插入,x节点作为新的栈顶 } //出栈,返回栈顶元素,栈空返回null @Override public T pop() {
if(this.top == null) return null; T temp = this.top.data;//保存栈顶节点元素 this.top = this.top.next;//删除栈顶节点 return temp; } //取出栈顶元素,未出栈,空栈返回null @Override public T get() {
return this.top == null ? null : this.top.data; } //返回栈所有元素的描述字符串,形式为“(,)”。算法同不带头结点的单链表 public String toString(){
String str = "("; for (Node
p = this.top; p != null; p = p.next){
str += p.data.toString(); if (p.next != null) str += ", ";//不是最后一个结点时后加分隔符 } return str + ")";//空表返回() }}

测试

package pers.zhang.stack;/** * @author zhang * @date 2020/1/16 - 14:36 */public class Stack_ex {
public static void main(String args[]) {
/* SeqStack
stack = new SeqStack
(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+" "); }*/ LinkedStack
stack = new LinkedStack
(); System.out.print("Push: "); for (int i=1; i<=5; i++) {
Integer intobj = new Integer(i); stack.push(intobj); System.out.print(intobj+" "); } System.out.println("\nStack: "+stack.toString()); System.out.print("Pop : "); while(!stack.isEmpty()) //全部出栈 System.out.print(stack.pop().toString()+" "); System.out.println(); }}

输出如下:

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

转载地址:http://fypqb.baihongyu.com/

你可能感兴趣的文章
打印机疑难解答_使用内置电源疑难解答改善Windows 7中的电池寿命
查看>>
下载spotify音乐_完成播放列表或专辑后如何停止Spotify停止自动播放音乐
查看>>
nest keyword_PSA:如果您的Nest Cam没有启用2FA,则黑客可能会监视您
查看>>
drupal加密_立即更新您的Drupal网站,否则黑客可能将其变成加密货币矿工
查看>>
vimrc配置 鼠标光标_在“提示”框中:即时调整窗口大小,包含鼠标光标并了解电池配置...
查看>>
询问HTG:安装XBMC附加组件,缩小视频以进行移动播放,自动更改默认打印机
查看>>
High Sierra推出后如何离开macOS公开Beta
查看>>
如何格式化您的WhatsApp消息
查看>>
pixel2pixel_Pixel 2的视觉核心是什么?
查看>>
更改用户账户设置自动更改_您应该更改的5个SimpliSafe设置
查看>>
excel中转换为数值_如何在Microsoft Excel中转换货币
查看>>
netflix怎么上_如何在Netflix上隐藏电视节目和电影
查看>>
opera_从Opera快速拨号页上删除混乱
查看>>
apple pencil_如何在iPad Pro的Apple Pencil上双击动作
查看>>
如何在PowerPoint中将自定义模板设置为默认模板
查看>>
linux使用命令重命名_如何在Linux上使用重命名命令
查看>>
xcloud下载_Project xCloud是Microsoft在流Xbox游戏上的赌博
查看>>
gpu驱动程序_如何从错误的GPU驱动程序更新中恢复
查看>>
esp now_Google带回Google Now(内部)排序助手
查看>>
如何防止视频在Chrome中自动播放
查看>>