精华内容
下载资源
问答
  • java数据结构-的底层实现:数组实现压入,弹出,判断空栈
    2021-04-23 16:23:04

    package com.stack;

    /**

    * @auther 付强

    * @date 2020/2/13 - 12:45

    */

    public class Mystack {

    //栈的底层我们使用数组来存储数据

    int[] elements;

    public Mystack(){

    elements=new int[0];

    }

    //压入元素

    public void push(int element){

    //创建一个新的数组

    int[] newArr=new int[elements.length+1];

    //把原数组中的元素复制到新的数组中

    for (int i = 0; i < elements.length; i++) {

    newArr[i]=elements[i];

    }

    //把添加的元素放入新数组中的

    newArr[elements.length]=element;

    //使用新数组替换就数组

    elements=newArr;

    }

    //取出栈顶元素

    public int pop(){

    //栈中没有元素

    if(elements.length==0){

    throw new RuntimeException("stack is empty");

    }

    //取出数组的最后一个元素

    int element = elements[elements.length - 1];

    //创建一个新的数组

    int[] newArr=new int[elements.length-1];

    //把原数组中处理最后一个元素的其他元素都放入新数组中

    for (int i = 0; i < elements.length - 1; i++) {

    newArr[i]=elements[i];

    }

    //替换数组

    elements=newArr;

    //返回栈顶元素

    return element;

    }

    //查看栈顶元素

    public int pick(){

    //栈中没有元素

    if(elements.length==0){

    throw new RuntimeException("stack is empty");

    }

    return elements[elements.length-1];

    }

    //判断栈是否为空

    public boolean isEmpty(){

    return elements.length==0;

    }

    }

    原文:https://www.cnblogs.com/fuqiang-java/p/12303305.html

    更多相关内容
  • 栈的特点就是先进后出,栈顶top设为数组的最后一个元素,当栈空的时候top==-;当栈满的时候top等于数组长度-1,入栈就是top++,出栈就是top--;因为栈是先进后出,因此当我们遍历数组的时候需要逆向遍历。 代码如下...

    栈的特点就是先进后出,栈顶top设为数组的最后一个元素,当栈空的时候top==-;当栈满的时候top等于数组长度-1,入栈就是top++,出栈就是top--;因为栈是先进后出,因此当我们遍历数组的时候需要逆向遍历。

    代码如下:

    public class Zhan {
        private int maxsize;
        private int top;
        private int[] arr;
    
        public Zhan(int maxsize){
            this.maxsize=maxsize;
            arr=new int[maxsize];
            top=-1;
        }
    
        //判断栈为空
        public boolean isEmpty(){
            return top==-1;
        }
        //判断栈满
        public boolean isFull(){
            return top==maxsize-1;
        }
    
        //入栈
        public void add(int date){
            if (isFull()){
                System.out.println("栈满,不能添加数组");
            }else {
                top++;
                arr[top]=date;
            }
        }
    
        //出栈
        public int delete(){
            if (isEmpty()){
                System.out.println("栈空,无数据可出!");
                return 0;
            }else{
                top--;
                return arr[top];
            }
        }
    
        //遍历
        public void bianliprint(){
            if (isEmpty()){
                System.out.println("栈为空,无法打印!");
            }else {
                for (int i=top;i>=0;i--){
                    System.out.println(arr[i]);
                }
            }
        }

    栈的测试类:

    public class ZhanTest {
        public static void main(String[] args) {
            Zhan z=new Zhan(4);
            z.add(1);
            z.add(2);
            z.add(3);
            z.add(4);
            z.bianliprint();
        }

    运行结果如下:

    展开全文
  • 今天修改辞职同事遗留的代码才发现这个问题,不能用isEmpty来判断一个对象是否为null,之前没在意这个问题,在报了指针之后才发现这个问题。查了一下关于判断的几个方法的区别,这里做一个简单的总结:null一...

    今天修改辞职同事遗留的代码才发现这个问题,不能用isEmpty来判断一个对象是否为null,之前没在意这个问题,在报了空指针之后才发现这个问题。

    查了一下关于判断为空的几个方法的区别,这里做一个简单的总结:

    null

    一个对象如果有可能是null的话,首先要做的就是判断是否为null:object == null,否则就有可能会出现空指针异常,这个通常是我们在进行数据库的查询操作时,查询结果首先用object != null,进行非空判断,然后再进行其他的业务逻辑,这样可以避免出现空指针异常。

    isEmpty() 此方法可以使用于字符串,数组,集合都可以用。

    首先看一下源码:

    public boolean isEmpty() {

    return value.length == 0;

    }

    这里是一个对象的长度,使用这个方法,首先要排除对象不为null,否则当对象为null时,调用isEmpty方法就会报空指针了。

    要想返回true,也就是一个对象的长度为0,也就是说首先这个对象肯定不为null了,内容为空时,才能返回true。

    这里我想到了之前看过视频里面说到的栈和堆的问题,当创建一个新的对象时,栈里面有一个对象,堆里面有一个对象,栈里的对象指向堆里面的对象。对象包含引用对象和实际对象,也就是栈和值的关系,比如String a = new String();,这句代码就在堆内存中产生了一个String对象"",和栈内存中一个引用对象a,也就是a指向了一个为空的字符串。当没有再次给引用对象a进行赋值时,操作a也即是操作这个空字符串。

    栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。

    堆内存:存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。

    下面我们通过一个图例详细讲一下堆和栈:

    比如主函数里的语句 int [] arr=new int [3];在内存中是怎么被定义的:

    主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值,但是右边不是一个具体值,是一个实体。实体创建在堆里,在堆里首先通过new关键字开辟一个空间,内存在存储数据的时候都是通过地址来体现的,地址是一块连续的二进制,然后给这个实体分配一个内存地址。数组都是有一个索引,数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化(这是堆内存的特点,未初始化的数据是不能用的,但在堆里是可以用的,因为初始化过了,但是在栈里没有),不同的类型初始化的值不一样。所以堆和栈里就创建了变量和实体:

    16a3504a27bb566e82bf2bd9ab1926f5.png

    下面看一个demo:

    public static void main(String[] args) {

    String a = new String();

    String b = "";

    String c = null;

    if (a.isEmpty()) {

    System.out.println("String a is empty");

    }

    if (b.isEmpty()) {

    System.out.println("String b is empty");

    }

    if (c == null) {

    System.out.println("String c = null");

    }

    if (null == a) {

    // 编译器直接就提示了Dead code,a指向了一个新对象,肯定不是null了

    System.out.println("String a =null");

    }

    if (a == "") {

    System.out.println("a = ''");

    }

    if (a.equals("")) {

    //由于a是字符串,字符串的比较需要用equals,不能直接用 ==

    System.out.println("a = ''");

    }

    /*if (c.isEmpty()) {

    // 这里会报空指针,即null不能使用此方法

    System.out.println("c == null and c.isEmpty");

    }*/

    List list = new ArrayList<>();

    //list.add("");

    if (list.isEmpty()) {

    System.out.println("list is empty");

    }

    System.out.println(list.size());

    }

    /*Output:

    String a is empty

    String b is empty

    String c = null

    equals:a = ''

    list is empty

    0

    */

    展开全文
  • JAVA顺序栈操作——初始化、入栈、出栈、判断空栈、判断栈满;顺序栈:使用一组连续的内存依次保存栈中的数据,定义一个top变量来保存栈顶序号。栈结构是“后进先出”的原则。

    顺序栈:使用一组连续的内存依次保存栈中的数据,定义一个top变量来保存栈顶序号。

    栈结构是“后进先出”的原则。

    栈的最基本操作有两个:push(入栈) + pop(出栈)


    import java.util.Scanner;
    
    /** 
    *  @author   LilyLee
     * @date     2017年4月25日
     * @time     下午4:25:15
     * @Version  1.0
     * @email    lilylee_1213@foxmail.com
     *
     */
    public class Mystack {
    
    	public static void main(String[] args) {
    		Stack_type st=new Stack_type();
    		Stack_Data data1=new Stack_Data();
    		Stack_type stack =st.STinit(); //初始化栈
    		Scanner sc=new Scanner(System.in);
    		System.out.println("input  name age end with name='0'"); //输入栈元素,以0结束
    		while(true){
    			Stack_Data sdata=new Stack_Data();
    			sdata.name=sc.next();
    			if(sdata.name.equals("0")){break;}
    			sdata.age=sc.nextInt();
    			st.PushST(stack, sdata);
    		}
    		String flag="1";
    		System.out.println("pop stack  end with 0");//输入任意非0元素完成弹栈
    		flag=sc.next();
    		while(!(flag.equals("0"))){
    			data1=st.PopST(stack);
    			if(data1==null){break;}
    			System.out.println(data1.name+" "+data1.age);
    			flag=sc.next();
    		}
    		System.out.println("End and Free");
    		st.STFree(st);
    		
    	}
    }
    
    class Stack_Data{
    	String name;
    	int age;
    }
    
    class Stack_type{
    	static final int MAXLEN=50; //定义栈的最大长度
    	Stack_Data[] data=new Stack_Data[MAXLEN+1];
    	int top;
    	
    	Stack_type STinit(){
    		Stack_type p;
    		
    		if((p=new Stack_type())!=null){  //申请栈内存
    			p.top=0;
    			return p;
    			}
    		return null;
    		
    	}
    	
    	boolean STIsEmpty(Stack_type s){  //判断栈是否为空
    		boolean t;
    		t=(s.top==0);
    		return t;
    	}
    	
    	boolean STIsFull(Stack_type s){  //判断栈是否已满
    		boolean t;
    		t=(s.top==MAXLEN);
    		return t;
    	}
    	
    	void STClear(Stack_type s){  //清空栈
    		s.top=0;
    	}
    	
    	void STFree(Stack_type s){ //释放栈所占用空间
    		if(s!=null){
    			s=null;
    		}
    	}
    	
    	int PushST(Stack_type s,Stack_Data data){
    		if((s.top+1)>MAXLEN){return 0;}  //栈溢出
    		s.data[++s.top]=data;
    		return 1;
    	}
    	
    	Stack_Data PopST(Stack_type s){
    		if(s.top==0){System.out.println("no elements!"); return null;} //栈为空,操作失败
    		return (s.data[s.top--]);
    	}
    	
    	Stack_Data PeekST(Stack_type s){
    		if(s.top==0){System.exit(0);}  //栈为空,操作失败
    		return (s.data[s.top]);
    	}
    	
    	
    }
    


    展开全文
  • 主要介绍了Java定义结构,并实现入栈、出栈操作,结合完整实例形式分析了java数据结构中的定义、以及入栈、出栈、是否为空判断大小计算、打印元素等相关操作技巧,需要的朋友可以参考下
  • java怎么判断字符是否为发布时间:2020-06-29 18:07:03来源:亿速云...java判断字符是否为以下为各位总结了java判断字符是否为的四种方法,希望对各位有帮助。方法一、最多人使用的一个方法, 直观, 方便, 但...
  • java判断字符串为

    千次阅读 2019-03-05 17:50:05
    Java空字符串与null的区别: 1、类型 null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ; ""表示的是一个字符串,也就是说它的长度为0。例如声明一个字符串...
  • 试用java.util.Stack泛型作为父类,用另一个泛型对象作为成员变量,模拟实现一个泛型子类Queue,当存储元素的第1个的元素超过dump时,再有元素入队列就倒入第2。除提供无参构造函数Queue( )外,其它所有队列...
  • Java空字符串与null的区别:1、类型null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;""表示的是一个字符串,也就是说它的长度为0。例如声明一个字符串String str = "" ;...
  • JAVA——的基本用法

    2022-02-10 18:00:18
    :(先进后出) 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为底。中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈...
  • Java判断字符串是否为

    万次阅读 2018-04-13 10:56:42
    思路:判断某字符串是否为,为的标准是str==null或str.length()==0一.字符串与null区别1、类型null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;""表示的...
  • (摘录加总结)------和队列不属于基础的数据结构,它们都属于线性表。一、对于存储操作元素只能在结构的一端进行元素的插入和删除,是一种性质上的线性表结构。按照“先进后出”的原则进行存储数据。先进的...
  • Java LinkedList判断是否为

    千次阅读 2019-12-02 10:15:59
    LinkedList 本身没有 isEmpty()方法 可以看下图 他的所有方法 但是 他 LinkedList extends AbstractSequentialList<E> implements List<E>, Deque<...父类中, 有 java.util.Abstra...
  • java中的

    2022-01-16 12:15:31
    本文阐述了对数据结构的理解,展示了继承关系,针对Stack被弃置的问题展开了探讨,具体解释了被弃置的原因,如何替代,使用队列实现的算法以及在面试中如何看待Stack。
  • java栈实现--顺序

    千次阅读 2021-04-22 16:15:12
    使用顺序存储结构实现的被称为顺序,这篇文章总结如何实现顺序
  • java的创建和使用

    万次阅读 多人点赞 2019-06-11 11:49:23
    JAVA Stack类: 是Vector的一个子类,它实现了一个标准的后进先出的本身最重要的就是 push 和 pop. 堆栈只定义了默认构造函数,用来创建一个空栈。堆栈除了包括由Vector定义的所有方法,也定义了自己的一些...
  • java的使用

    千次阅读 2021-08-18 13:54:30
    栈是什么: 栈的定义 栈是我们经常使用的一种线性数据结构,它是只能通过一端操作的线性表...栈最主要的操作有入栈,出栈,取栈顶元素和判断栈是否为 入栈:即将栈从顶部压入 出栈:取出并删除出栈顶的元素 取栈顶:
  • Java空字符串与null的区别:1、类型 null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ; ""表示的是一个字符串,也就是说它的长度为0。例如声明一个字符串String str = "...
  • Java的基本操作

    千次阅读 2020-02-27 15:50:20
    1.实例化 Stack stack = new Stack(); 2.进栈 stack.push(Object);//返回的是入栈的内容 stack.add(Object);//返回的是true或false 3.出栈 ...4.判断是否为 stack.isEmpty(); 5.输出([ , , , …]...
  • 首先需要理解null和“ ”的区别: null表示这个字符串在中没有任何指向因此在堆中没有分配内存空间,如果要调用这个字符串会出现指针... 判断一个对象是否是“” 用eques() 判断一个字符串是否是null 用 ...
  • java数据结构-

    2022-02-18 12:11:57
    1、的定义 (Stack):是只允许在一端进行插入或删除的线性表。首先是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。...StackEmpty(S):判断一个是否为,若则返回t
  • 的定义 1、是一个先入后出的有序列表 2、是限制线性表中的插入和删除只能在线性表是同一端进行的一种特殊法。插入和删除的一端,为变化的一端 称为栈顶(Top),另一端称为底(Bottom). 3、出栈(pop)和入栈...
  • 转载:https://mp.weixin.qq.com/s/CMjs36IXp1E2EyKiaCz80g相信在座的各位都遇到过指针异常,不甚其烦,本文不是教你避免指针,而是一些对指针其他方面的理解。本文可能有点另类,也可能会打破你对指针的...
  • Java中的排序

    2021-03-13 20:43:25
    本篇博客是上一篇博客的延续。在实现图论算法的过程中,需要对中的元素进行排序。我使用的是双栈排序算法,实现的是将中的元素按从大到小的顺序排列...2、首先判断stackSrc是否为,如果为,则抛出异常No...
  • Java判断对象是否为的方法:isEmpty,null,"

    万次阅读 多人点赞 2019-01-08 17:39:05
    今天修改辞职同事遗留的代码才发现这个问题,不能用isEmpty来判断一个对象是否为null,之前没在意这个问题,在报了指针之后才发现这个问题。 查了一下关于判断的几个方法的区别,这里做一个简单的总结: null...
  • 韩顺平java数据结构随堂笔记
  • java 的基本介绍

    千次阅读 2021-03-06 16:06:27
    根据的定义可知,最先放入中元素在底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除 的应用场景 子程序的调用:在跳往子程序前,会先将下个指令的地址存到...
  • java栈的实现及应用

    2022-03-26 16:05:43
    的解释,及利用查看字符串中括号是否匹配

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 98,213
精华内容 39,285
关键字:

java判断栈空

java 订阅