【数据结构】栈
创始人
2025-01-07 15:05:07
0

目录

  • 栈的模拟实现
    • 栈的顺序实现
      • 接口实现
      • 成员变量
      • 默认构造方法
      • 入栈
      • 判满
      • 获取栈元素个数
      • 出栈
      • 获取栈顶元素 但是不删除
      • 判空
    • 栈的链式实现
      • 接口实现
      • 内部类
      • 入栈
      • 出栈
      • 判空
      • 获取栈顶元素 但是不删除
      • 获取栈元素个数
  • Java中的Stack
    • 实现的接口
    • 常用方法
  • 栈练习

栈是限定仅在表尾进行插入和删除操作的线性表,一种**先进后出**的数据结构。

栈顶: 允许插入和删除的一端。
栈底:不允许插入和删除的一端。
压栈:栈的插入操作。
出栈:栈的删除操作。
栈

栈的模拟实现

栈的底层可以是顺序表,可以是链表实现。

栈的顺序实现

栈的顺序实现就是使用顺序表为底层实现。

接口实现

实现的接口(成员方法)如下:
顺序表可以多实现一个判满接口。

public class MyStack { 	//默认构造方法 	public MyStack() {} 	//入栈     public void push(int val) {} 	//判满     public boolean isFull() { } 	//出栈     public int pop() {}     //获取栈顶元素 但是不删除     public int peek() { }      //获取栈元素个数     public int size(){}      //判空     public boolean isEmpty() { }        } 

成员变量

我们使用一个数组,和一个int类型usedSize来表示栈中元素个数。

	public int[] elem;     public int usedSize; 

默认构造方法

在构造方法中我们将数组申请10个int空间。

 public MyStack() {         this.elem = new int[10];     } 

入栈

注意事项:

  • 先判断栈是否是满的,满的就要先扩容。
  • 入栈时usedSize也要跟着加1。
public void push(int val) {         if (isFull()) {             this.elem = Arrays.copyOf(elem, 2 * elem.length);         }         elem[usedSize++] = val;     } 

判满

直接判断usedSize是否等于数组长度。

public boolean isFull() {         return usedSize == elem.length;     } 

获取栈元素个数

直接返回usedSize即可。

    public int size(){     	return usedSize;     }  

出栈

注意事项:

  • 要先判断栈是不是空,是空抛一个异常。
  • 栈不为空,返回数组最后一个元素,同时usedSize要减1。
  public int pop() throws IndexIllegalException{         try {             if (isEmpty()) {                 throw new IndexIllegalException("栈为空");             }         }catch (IndexIllegalException e){             e.printStackTrace();         }         return elem[--usedSize];     } 

获取栈顶元素 但是不删除

注意事项:

  • 要先判断栈是不是空,是空抛一个异常。
  • 栈不为空,返回数组最后一个元素,同时usedSize不动。
public int peek() throws IndexIllegalException{         try {             if (isEmpty()) {                 throw new IndexIllegalException("栈为空");             }         }catch (IndexIllegalException e){             e.printStackTrace();         }         return elem[usedSize - 1];     } 

判空

直接返回usedSize等不等于0。

public boolean isEmpty() {         return usedSize == 0;     } 

栈的链式实现

在实现栈前我们先思考使用什么样的链表来实现?
由于栈的特性是先入后出,如果使用单链表我们出栈时要拿到最后一个节点前一个节点,使复杂度为O(N),所以我们使用双向链表。

接口实现

实现的接口如下:

public class MyStack { 	//入栈     public void push(int val) {} 	//出栈     public int pop() {}     //获取栈顶元素 但是不删除     public int peek() { }     //判空     public boolean isEmpty() { }            //获取栈元素个数     public int size(){}   } 

内部类

跟双向链表的内部类实现差不多。

static class ListNode{         public int val;         public ListNode prev;         public ListNode next;          public ListNode(int val) {             this.val = val;         }     }     public ListNode head;     public ListNode last; 

入栈

实现思路:

  1. 先判断栈是否为空,空就头尾直接指向入栈节点。
  2. 不为空就将尾节点的next指向入栈节点,入栈节点的prev指向尾节点,尾节点修改为入栈节点。
public void push(int val){ 	ListNode cur = new ListNode(val); 	if(isEmpty()){ 		head = last = cur; 		return; 	} 	last.next = cur; 	cur.prev = last; 	last = cur; } 

出栈

实现思路:

  1. 先判断栈是否为空,栈为空抛异常。
  2. 栈不为空,将尾节点记录下来,尾节点变为前一个节点,并将next置空。
public int pop() throws NullPointerException{ 	try{ 		if(isEmpty()){ 			throw new NullPointerException; 		} 	}catch(NullPointerException e){ 		 e.printStackTrace(); 	} 	ListNode cur = last; 	last = last.prev; 	last.next = null; 	return cur.val; } 

判空

直接返回头是否为空就行。

public boolean isEmpty(){ 	return head == null; } 

获取栈顶元素 但是不删除

实现思路:

  1. 先判断栈是否为空,栈为空抛异常。
  2. 栈不为空,返回尾节点。
public int peek(){ 	try{ 		if(isEmpty()){ 			throw new NullPointerException; 		} 	}catch(NullPointerException e){ 		 e.printStackTrace(); 	} 	return last.val; } 

获取栈元素个数

直接循环遍历即可。

    public int size(){     	ListNode cur = head;     	int size = 0; 		while(cur != null){ 			cur = cur.next; 			size++; 		} 		return size; 	}  

Java中的Stack

实现的接口

接口
接口说明:

  • 继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。
  • 实现了Cloneable接口,可克隆。
  • 实现了RandomAccess接口,支持随机访问。
  • Serializable接口表示支持序列化。

常用方法

提供的常用方法如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FhLLHxMB-1720973208640)(https://i-blog.csdnimg.cn/direct/f414e542bd80432095def0a48671fd3f.png)]

栈练习

有效的括号

逆波兰表达式求值

栈的压入 弹出序列

最小栈

相关内容

热门资讯

教程辅助“九游破解辅助插件教程... 教程辅助“九游破解辅助插件教程”讲解有挂开挂辅助工具揭秘教程>>您好:软件加薇136704302中联...
我来向大家传授“榕城510k有... 我来向大家传授“榕城510k有没有挂”聚星ai辅助工具收费多少(带开挂辅助平台实用技巧) 了解更多开...
教程辅助“wepoker数据分... 教程辅助“wepoker数据分析”揭秘有挂开挂辅助插件细节方法《详细加薇136704302咨询》游戏...
揭秘一下“家乡大二辅助”wep... 较多好评“微乐万能挂官网”开挂(透视)辅助教程 了解更多开挂安装加(136704302)微信号是一款...
教程辅助“相约互娱辅助”讲解有... 教程辅助“相约互娱辅助”讲解有挂开挂辅助下载2026新版;无需打开直接搜索薇:136704302 咨...
透视app“牛总管辅助方法”h... 透视app“牛总管辅助方法”hhpoker有后台操作吗(带开挂辅助插件玩家教你);无需打开直接搜索打...
教程辅助“天天微友第三方辅助软... 您好:这款天天微友第三方辅助软件下载游戏是可以开挂的,确实是有挂的,很多玩家在这款天天微友第三方辅助...
一分钟揭秘“蜀山辅助器有哪些功... 一分钟揭秘“蜀山辅助器有哪些功能”wepoker透视版下载(带开挂辅助软件力荐教程);打开点击测试直...
教程辅助“哈糖大菠萝有挂吗5个... 教程辅助“哈糖大菠萝有挂吗5个常用方法”有挂教程开挂辅助脚本可靠技巧;无需打开直接搜索薇:13670...
推荐几款新版“福州十八扑有挂吗... 推荐几款新版“福州十八扑有挂吗”wepoker辅助软件价格(带开挂辅助神器细节方法);无需打开直接搜...