两栈共享空间(java实现)
2015-05-07 10:06
447 查看
如果我们有两个相同类型的栈,我们为他们各自开辟了数组空间,极有可能第一个栈已经满了,再进栈就溢出了,而另一个栈还有很多存储空间空闲。这时,我们可以充分利用顺序栈的单向延伸的特性,使用一个数组来存储两个栈,让一个栈的栈底为数组的始端,另一个栈的栈底为数组的末端,每个栈从各自的端点向中间延伸。
如下图所示:
其中,top1和top2分别为栈1和栈2的栈顶指针,size为整个数组空间的大小,栈1的底固定在下标为0的一端,栈2的底固定在下标为size-1的一端。
实现代码:
如下图所示:
其中,top1和top2分别为栈1和栈2的栈顶指针,size为整个数组空间的大小,栈1的底固定在下标为0的一端,栈2的底固定在下标为size-1的一端。
实现代码:
package com.dhy.seqstack; /** * 两栈共享空间 * @author Administrator * */ public class BothStack <T>{ private Object[] element; //存放元素的数组 private int stackSize; // 栈大小 private int top1; //栈1的栈顶指针 private int top2; //栈2的栈顶指针 /** * 初始化栈 * @param size */ public BothStack(int size){ element = new Object[size]; stackSize = size; top1 = -1; top2 = stackSize; } /** * 压栈 * @param i 第几个栈 * @param o 入栈元素 * @return */ public boolean push(int i , Object o){ if(top1 == top2 - 1) throw new RuntimeException("栈满!"); else if(i == 1){ top1++; element[top1] = o; }else if(i == 2){ top2--; element[top2] = o; }else throw new RuntimeException("输入错误!"); return true; } /** * 出栈 * @param i * @return */ @SuppressWarnings("unchecked") public T pop(int i){ if(i == 1){ if(top1 == -1) throw new RuntimeException("栈1为空"); return (T)element[top1--]; } else if(i == 2){ if(top2 == stackSize) throw new RuntimeException("栈2为空"); return (T)element[top2++]; } else throw new RuntimeException("输入错误!"); } /** * 获取栈顶元素 * @param i * @return */ @SuppressWarnings("unchecked") public T get(int i){ if(i == 1){ if(top1 == -1) throw new RuntimeException("栈1为空"); return (T)element[top1]; } else if(i == 2){ if(top2 == stackSize) throw new RuntimeException("栈2为空"); return (T)element[top2]; } else throw new RuntimeException("输入错误!"); } /** * 判断栈是否为空 * @param i * @return */ public boolean isEmpty(int i){ if(i == 1){ if(top1 == -1) return true; else return false; } else if(i == 2){ if(top2 == stackSize) return true; else return false; } else throw new RuntimeException("输入错误!"); } /** * 遍历 */ @SuppressWarnings("unchecked") @Override public String toString(){ String str1 = "栈1:["; String str2 = "栈2:["; for(int i=top1;i>=0;i--){ if(i == 0) str1 = str1 + (T)element[i]; else str1 = str1 + (T)element[i] + ","; } str1 += "]"; for(int i=top2;i<stackSize;i++){ if(i == stackSize-1) str2 = str2 + (T)element[i]; else str2 = str2 + (T)element[i] + ","; } str2 += "]"; return str1 + "\n\r" + str2; } }
相关文章推荐
- Java实现栈-两栈共享空间
- C++数据结构:栈——顺序栈实现的之二:两栈共享空间
- 两栈共享空间的实现
- 顺序栈的实现和两栈共享空间
- C语言实现两栈空间共享
- 数组实现栈和两栈共享空间
- C++类模板 实现两栈共享数组空间的算法 《数据结构》(北京科海) 自己摘抄完成
- 两栈共享空间的c语言实现
- Java快速排序的实现和时间空间复杂度分析
- java核心知识点学习----多线程间的数据共享的几种实现方式比较
- Java中如何实现单个线程范围内的数据共享
- ThreadLocal实现:java线程范围内的共享数据,线程外独立
- java线程:单例隐藏ThreadLocal实现线程数据共享
- java中共享内存的实现
- 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源
- 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源
- 两栈共享空间
- 共享内存在java中的实现
- 通过jcifs实现java访问网络共享文件
- 在Java中实现.NET的System.Data名称空间下的功能-九年以后