五、栈-队列

栈这个东西就搞基啦,不是,是高级!

菜鸟的我总是把堆、栈这些东西搞混。堆栈一直困扰这我,幸运的是,数据结构让我学习了很多这方面的事情,而且,这个过程十分愉悦。

********************************************正文:《java数据结构与算法第二版》第四章

栈:是一种“先进后出”的数据思想,对,是思想,而不是结构。栈是一种抽象数据结构,它可以由数组来实现,也可以由链表来实现,只要实现了压栈push(把一个新元素插入数据顶端),弹出pop功能(把数据顶端的元素移除),这就是一个栈,它只关注能做什么,而不关注怎么来做。

栈通常是这样的一种抽象数据结构,要求:

1.一次只允许访问栈内的一个元素,这个元素必须是顶端的数据(查询)。

2.栈的插入只能插入在最顶端(压栈push)。

3.栈的弹出只能弹出最顶端的数据(移除pop)。

我们经常讲的,在jvm运行中,局部变量(某个方法内的变量)存放在栈(准确说是栈帧)中,就是指的,这个变量是存放在jvm划分的内存区域,这块区域具有栈的功能,压入,弹出功能。主谓宾结构简化语义就是——变量存放在内存中,这块内存实现了栈的效果,这点十分重要。如果您想继续了解,可以到本文末尾,有链接

栈的压栈和弹出可以看以下代码,Stack是一个由数组实现的栈,实现了压栈,弹出的方法,

public class Stack {
    private int maxSize;  //声明栈的总容量
    private long[] stackArray; //声明数据为数组来实现
    private int top; //定义一个int来随时保留栈顶的下标

    public Stack(int s){
        maxSize = s;
        stackArray = new long[maxSize];
        top = -1;
    }
//压栈,每次把新元素都放在最顶端(默认为数组的末尾为顶端),注意这里是 ++top,而不是top++,这里请准确区分
    public void  push(long j){
        stackArray[++top] = j;
    }
//弹出(移除栈顶)
    public long pop(){
        return stackArray[top--];
    }
//查询方法
    public long peek(){
        return stackArray[top];
    }
//非空判断
    public boolean isEmpty(){
        return (top == -1);
    }
//栈满了
    public boolean ifFull(){
        return (top == maxSize - 1 );
    }
}
class StackApp{
    public static void main(String[] args){
        Stack stack = new Stack(10);
        stack.push(20);
        stack.push(40);
        stack.push(700);
        stack.push(800);

        while(!stack.isEmpty()){
            System.out.println(stack.pop());//注意,打印的顺序和压栈的顺序是相反的,这就是栈的“先进后出”的思想。
        }

    }
}

栈的“先进后出的思想”是有很多的使用场景的,比如,编码过程中,成对出现的符号就可以通过栈的方式来判断是否格式有问题,因为成对的符号在压栈的时候,总是贴在一起的,比如这段内容:我说“《数据结构与算法(第二版)》太精彩了”,如果用数组对标点符号压栈保存的话,肯定是[ " ,《 ,( , ) , 》, " ] 这样的,如果出现了[     ",《 , " , ( , ), 》 ],那就表示,标点符号出了问题了  。而jvm的进入方法、返回方法也是这样的思想。  如果您还想找点乐子的话,可以去研究一下 后缀表达式,场景是曾经面试的时候,遇到的一个问题,如何处理 混合四则运算的string,并获得计算结果。

课外题:i++ 和 ++i有什么区别呢?

i++ 和 ++i 只需要记两点,共同点是,他们都会让i发生变化,即+1;不同点是,这两个都会返回值,i++返回的是i的原值的副本,所以 i =0;a = i++ ,产生的结果是 a=i的原值副本 = 0,  i=1。 ++i返回的是i的本身,此时i已经完成了+1,所以i = 0; a = ++i,  a= 1,i=1 。

请指出下面代码,为啥count没有达到计数目的,这是一个新手可能会犯的问题。

    public static void main(String[] args){

        int count =0;
        for (int i =0 ; i< 10;i++){
            count = count++;
            System.out.println(count+"....");
        }
    }
如果你想深入一点了解的话,可以看看这个内容《 在java中谈尾递归--尾递归和垃圾回收的比较》的 第三节,我觉得很接地气,就摘抄了下来,也非常建议看到这里的您搭配栈数据结构,去了解一下这个内容,印象十分深刻。看了记得回来,重温一下栈的思想。

下一篇,队列,“乖乖站好♂”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值