目录
内存空间在逻辑上划分用三部分:代码区 静态数据区 动态数据区
一.内存中的堆栈和数据结构的堆栈
数据结构中堆栈与内存中的堆栈是完全不同的两个概念。内存当中的堆栈是真实存在的物理区域,而数据结构中的堆栈是人为抽象出来的一种逻辑存储结构。
- 内存中的堆栈
内存空间在逻辑上划分用三部分:代码区 静态数据区 动态数据区
代码区:存放程序的二进制代码,即cpu的机器执行指令。
静态数据区:存放常量(包括final修饰的常量和String修饰的常量),静态变量(static修饰的变量),全局变量
动态数据区(包括堆和栈):
堆区: New的对象存放在堆区中。由程序员手动分配和回收,如果不手动释放也可能由OS回收。类似于链表,在内存中是不连续分配的,在不同区域通过指针链接起来。栈区的存储速度比堆区速度低。
栈区: 存放方法的局部变量,形参和返回值。由编译器自动进行回收。逻辑结构类似于数据结构当中的堆,是一块连续的内存区域。栈区的存储速度比堆区的存储速度要快。
- 数据结构中的堆栈
栈:是一种简单的线性数据结构。把可以进行存储和取出元素的一端称为栈顶,把不可操作的另一端称为栈底。其特点是存储 的数据遵从先进后出的原则。
堆:是一棵完全二叉树结构,特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。
二.栈的基本操作
- 栈的创建
- 入栈操作push
- 出栈操作pop
- 得到栈顶元素
- 移除栈顶元素
- 空栈判断
- 满栈判断
- 遍历栈
JAVA数组实现栈:
public class MyStack {
private int top; // 栈顶指针
private int MaxVaule; // 栈的长度
private int MyArray[]; // 数组
public MyStack(){ // 无参构造
MyArray=new int[20];
top=-1;
}
public MyStack(int MaxValue){ //创建指定长度的栈
MyArray=new int[MaxValue];
this.MaxVaule=MaxValue;
top=-1;
}
public boolean IsFull(){ //栈满判断
return top>=MaxVaule-1;
}
public boolean IsEmpty(){ //栈空判断
return top <=-1;
}
public void push(int data){ //入栈
if(IsFull()){
System.out.println("The Stack is full");
return;
}
else
MyArray[++top]=data;
}
public int pop(){ //出栈
if(IsEmpty()) {
System.out.println("The Stack is empty");
return 0;
}
return MyArray[top--];
}
public int getTopData(){ //获取栈顶元素
return MyArray[top];
}
public void removeTopData(){ //移除栈顶元素
MyArray[top]=0;
--top;
}
public void show(){ //遍历堆栈
for(int i=MyArray.length-1;i>-1;i--){
System.out.println(MyArray[i]);
}
}
}
三.关于栈的一些常见问题
- 使用栈计算后缀表达式
- 对栈的元素进行排序
- 判断表达式是否括号平衡