栈及其注意事项

本文深入解析了栈和堆这两种内存管理方式的区别,包括它们的地址增长方向、分配和释放机制。详细介绍了栈的先进后出特性及其在代码执行中的角色,同时提供了栈实现的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆(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());
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值