栈这个东西就搞基啦,不是,是高级!
菜鸟的我总是把堆、栈这些东西搞混。堆栈一直困扰这我,幸运的是,数据结构让我学习了很多这方面的事情,而且,这个过程十分愉悦。
********************************************正文:《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中谈尾递归--尾递归和垃圾回收的比较》的
第三节,我觉得很接地气,就摘抄了下来,也非常建议看到这里的您搭配栈数据结构,去了解一下这个内容,印象十分深刻。看了记得回来,重温一下栈的思想。
下一篇,队列,“乖乖站好♂”