栈的基本操作
以栈存储的数据是char类型为例:
- void push(char)/boolean push(char) //压入一个数据
- char pop() //删除并返回栈顶的元素
- char top() //返回栈顶元素
- int size() //返回数据个数
- boolean isEmpty() //判断栈是否为空
- boolean isStackFull() //判断栈是否已满
栈的实现代码
- 当数组大小过小倍增数组(push函数中实现),大小过大倍减数组(pop函数中实现)。
- 发现了pop编写过程中容易出现的几个错误,已经注释在代码中。
package stack;
//DAStack: Double Array Stack 倍增数组栈
public class DAStack {
private char[] datas;
int top,capacity;//容量
public DAStack(){
top=-1;
capacity=1;
datas=new char[capacity];
}
public void push(char data){
top++;
if(top<capacity){
datas[top]=data;
}
else{
char[] copy=new char[capacity*2];
System.arraycopy(datas, 0, copy, 0, capacity);
copy[top]=data;
capacity=capacity*2;
datas=copy;
}//top=capacity
}
public char pop(){
if(top!=-1){
top--;
char topData= datas[top+1];
if((top+1)*2<=capacity&&capacity>1){/*一定注意容量到了1就不要继续缩减了 否则push中capacity*2失效*/
capacity=capacity/2;//先把容量缩减 否则容易犯错
char[] copy=new char[capacity];
System.arraycopy(datas, 0, copy, 0, capacity);
datas=copy;
}
return topData;
}
else return '!';//pop可能失败
}/***************************此函数易错******************************/
public char top(){
return datas[top];
}
public boolean isEmpty(){
return (top==-1);
}
public boolean isStackFull(){
return (top+1==capacity);
}
}
全面测试
package stack;
public class TestDAStack {
public static void main(String[] args){
DAStack das=new DAStack();
System.out.print(das.isEmpty()+" ");
System.out.println(das.isStackFull());
//此时容量为1 无数据
das.push('f');
System.out.print(das.isEmpty()+" ");
System.out.println(das.isStackFull());
//此时容量为1 有1数据 栈满
das.push('d');
System.out.print(das.isEmpty()+" ");
System.out.println(das.isStackFull());
//此时容量倍增为2 有2数据 栈满
das.push('e');
System.out.print(das.isEmpty()+" ");
System.out.println(das.isStackFull());
//容量4 有3数据 不空不满
for(int i=0;i<4;i++){
System.out.print(das.pop()+" ");
System.out.print(das.isEmpty()+" ");
System.out.println(das.isStackFull());
}
}
}
输出如下:
true false
false true
false true
false false
e false true
d false true
f true false
! true false