您的位置:首页 > 编程语言 > Java开发

两栈共享空间(java实现)

2015-05-07 10:06 447 查看
如果我们有两个相同类型的栈,我们为他们各自开辟了数组空间,极有可能第一个栈已经满了,再进栈就溢出了,而另一个栈还有很多存储空间空闲。这时,我们可以充分利用顺序栈的单向延伸的特性,使用一个数组来存储两个栈,让一个栈的栈底为数组的始端,另一个栈的栈底为数组的末端,每个栈从各自的端点向中间延伸。

如下图所示:



其中,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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: