算法之 栈内存共享空间

package bin;

import java.util.ArrayList;
import java.util.List;

import javax.management.RuntimeErrorException;

/**
 * @author bin 15/3/10
 * target  共享栈空间
 *
 */
public class Bin_stack_share {
    private int top1;//栈一的栈顶记录
    private int top2;//栈二的栈顶记录
    private Object obj[];//存储容器
    private int type;
    private int size;//栈长度

    public int getTop1() {
        return top1;
    }

    public void setTop1(int top1) {
        this.top1 = top1;
    }

    public int getTop2() {
        return top2;
    }

    public void setTop2(int top2) {
        this.top2 = top2;
    }

    public Object[] getObj() {
        return obj;
    }

    public void setObj(Object[] obj) {
        this.obj = obj;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    //构造方法 初始化栈长度
    public Bin_stack_share(int size){
        this.setTop1(-1);
        this.setTop2(size);
        this.setSize(size);
        this.setObj(new Object[size]);
    }

    //进栈方法
    public void push(Object val,int type){
        if(top1+1 == top2){
            throw new RuntimeException("栈满");
        }
        //如果type 为1 则入栈一    else 为栈二
        if(type == 1){
            obj[top1+1] = val;
            top1 = ++top1;
        }else{
            obj[top2-1] = val;
            top2 = --top2;
        }
    }
    public Object pop(int type){

        if(top1 == -1 && top2 == size){
            throw new RuntimeException("空栈");
        }
        Object temp = new Object();
        if(type == 1){
            //当TYPE等于1的时候 我们弹出栈1的栈顶
            temp = obj[top1];
            obj[top1] = null;
            top1 = --top1;
        }else{
            temp = obj[top2];
            obj[top2] = null;
            top2 = ++top2;
        }
        return temp;
    }

    public static void main(String[] args) {

        Bin_stack_share b = new Bin_stack_share(2);
        b.pop(2);

        System.out.println(b.top1);

    }

}
 
时间: 2024-08-06 15:13:45

算法之 栈内存共享空间的相关文章

两栈共享空间的存储结构和入栈出栈操作

参考<大话数据结构>P95~96——两栈共享存储空间. 当两个栈的需求空间有相反关系时,也就是一个栈增长时,另一个栈在缩短,可以采用两栈共享空间结构.这是针对两个具有相同数据类型的栈的一个设计技巧. 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 #define MAXSIZE 6 //本例中栈满共6个元素 6 typed

JavaScript 数据结构与算法之美 - 栈内存与堆内存 、浅拷贝与深拷贝

前言 想写好前端,先练好内功. 栈内存与堆内存 .浅拷贝与深拷贝,可以说是前端程序员的内功,要知其然,知其所以然. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 栈 定义 后进者先出,先进者后出,简称 后进先出(LIFO),这就是典型的栈结构. 新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底. 在栈里,新元素都靠近栈顶,旧元素都接近栈底. 从栈的操作特性来看,是一种 操作受限的线性表,只允许在

Java堆空间Vs栈内存

之前我写了几篇有关Java垃圾收集的文章之后,我收到了很多电子邮件,请求解释Java堆空间,Java栈内存,Java中的内存分配以及它们之间的区别. 您可能在Java,Java EE书籍和教程中看到很多有关堆和变量内存的参考,但是几乎没有就程序而言完全解释堆和栈的内存分配的. Java堆空间 Java运行时使用Java堆空间为对象和JRE类分配内存.每当我们创建任何对象时,它总是在堆空间中创建. 垃圾回收在堆内存上运行以释放没有任何引用的对象使用的内存.在堆空间中创建的任何对象都具有访问权限,并

通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的. 堆内存与栈内存 ,,堆内存与栈内存能不能共享

创建一个对象都在内存中做了什么事情? 1:先将硬盘上指定位置的Person.class文件加载进内存.2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p.3:在堆内存中开辟一个实体空间,分配了一个内存首地址值.new4:在该实体空间中进行属性的空间分配,并进行了默认初始化.5:对空间中的属性进行显示初始化.6:进行实体的构造代码块初始化.7:调用该实体对应的构造函数,进行构造函数初始化.()8:将首地址赋值给p ,p变量就引用了该实

两栈共享空间

1 思路 如果有两个类型相同的栈,我们为它们分别开辟了数组空间.极有可能是一个栈已经满了,再入栈就溢出了,而另一个栈却还有很多存储空间.这又何必呢?我们完全可以用一个数组来存储两个栈,只不过需要一些小的技巧. 我们的做法如下,数组有两个端点,两个栈有两个栈底.让一个栈的栈底为数组的始端,即数组下标为0的位置.让另一个栈的栈底为数组的末端,即数组下标为n-1的位置.这样如果两个栈增加元素,就是两端点向中间延伸. 其实关键思路是:它们是在数组的两端,向中间靠拢.top1和top2是两个栈的栈顶指针.

顺序栈的实现和两栈共享空间

顺序栈的实现和两栈共享空间 一.顺序栈的实现 栈(stack)是限定仅在表尾进行插入或删除操作的线性表.我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何 数据元素的栈称为空栈.栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构. 理解栈的定义需要注意: 首先他是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系.只不过他是一种特殊的线性表而已.定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底. 他的

数据结构:两栈共享空间

两栈共享空间方法: 数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的始端,即下标为0处,另一个的栈底为数组的末端,即下标为n-1处.这样,如果两个栈增加元素,就是两端点向中间延伸.当top1 + 1 == top2 的时候为栈满. 但是这只是针对两个具有相同数据类型的栈的一个设计上的技巧,这种数据结构适合一个栈增长一个栈同时在缩短的情况,就像有卖的同时一定有买,有输的同时一定有赢,适合一种零和博弈. 两栈共享空间的代码实现: #include <iostream> #include &

两栈共享空间的c语言实现

1. 两栈共享空间结构 typedef struct { SElemType data[MAXSIZE]; int top1; /* 栈1栈顶指针 */ int top2; /* 栈2栈顶指针 */ }SqDoubleStack; 2. 构造一个空栈S Status InitStack(SqDoubleStack *S) { S->top1=-1; S->top2=MAXSIZE; return OK; } 3. 把S置为空栈 Status ClearStack(SqDoubleStack *

数据结构(七)两栈共享空间

一.栈的顺序存储的一个很大的缺陷就是必须事先确定数组存储空间大小,万一不够用了,就要用编程手段来扩展数组的容量,非常麻烦. 二.对于一个栈,也只能尽量考虑周全,设计出合适大小的数组来处理:但是对于两个相同类型的栈,可以做到最大限度地利用其事先开辟的存储空间来进行操作. 三.如果有两个相同类型的栈,为它们各自开辟了数组空间,极有可能是第一个栈已经满了,再进栈就溢出了,而另外一个栈还有很多存储空间.所以两栈共享空间的思想是:让一个栈的栈底为数组的开始端,即下标为0处,另一个栈的栈底为数组的末端,即下