栈
堆(heap)和栈(stack)的区别及注意事项
heap堆:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。由程序员手动分配的内存空间,不会随着代码结束而自动释放内存空间,需要人为写出代码释放内存空间。
stack栈:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。由编译器自动分配内存空间,代码结束,自动释放内存空间。它的内部结构是一个容器式,只有一个进口,并且也作为出口。这就是导致,先进来的数据在“容器”底部,后进来的数据在“容器顶部”,出栈的时候,就应验了“后进先出,先进后出”的这句话。
栈实现的代码
package cn.goktech.stack;
import java.sql.Date;
/**
* 栈的结构:
*
* 1.boolean push(T t) 进栈
* 2.E pop() 出栈
* 3.boolean peek() 检查下一个
* @author Administrator
*
*/
public class MyStack<T> {
private int size;
private int top;
private Object[] data;
private int len;
/**
* 无参构造
*/
public MyStack() {
this.size=0;
this.top=0;
this.data=new Object[10];
this.len=10;
}
/**
* 构造方法
* @param len 栈的容量
*/
public MyStack(int len) {
this.top=-1;
this.size=0;
if (len<=0) {
len=10;
}
this.len=len;
data=new Object[len];
}
/**
* 入栈
* @param t 入栈数据
* @return boolean
*/
public boolean push(T t) {
if (size==len) {
return false;
}else {
data[++top]=t;
size++;
return true;
}
}
/**
* 出栈
* @return 栈顶元素
*/
public T pop() {
if (size==0) {
return null;
}else {
T t=(T)data[top--];
size--;
return t;
}
}
/**
* 检视栈顶元素
* @return boolean
*/
public boolean peek() {
if (size==0) {
return false;
}else {
T t=(T)data[top];
System.out.println(t);
return true;
}
}
/**
* 获取栈的大小
* @return
*/
public int size() {
return size;
}
public static void main(String[] args) {
MyStack<Integer> intStack=new MyStack<>();
intStack.push(1);
intStack.push(2);
intStack.push(3);
intStack.peek();
System.out.println(intStack.pop());
intStack.push(4);
System.out.println(intStack.pop());
System.out.println(intStack.pop());
System.out.println(intStack.pop());
}
}