一、定义接口
package Statck;
public interface IStatck<T> {
/**
* 压栈
* @param t
*/
public void push(T t);
/**
* 弹栈
*/
public T Pop();
/**
* 返回元素个数
* @return
*/
public int StackLength();
/**
* 清空栈
*/
public void ClearStack();
}
二、自定义类
package Statck;
public class MStack<T> implements IStatck<T> {
private int top=-1;
Object[] objArray ;
int MAX;
/**
* 构造函数,初始化数组大小
* @param n
*/
MStack(int n){
MAX=n;
objArray = new Object[MAX];
}
/**
* 压栈
*/
@Override
public void push(T t) {
if(top>=MAX-1){//top==Max-1时满栈
throw new RuntimeException("超出栈上线");
}else{
top++;
objArray[top]=t;
}
}
/**
* 弹栈
*/
@Override
public T Pop() {
if(top==-1){
throw new RuntimeException("空栈,无法弹出元素");
}else{
T t =(T)objArray[top];
top--;
return t;
}
}
/**
* 长度
*/
@Override
public int StackLength() {
return top+1;
}
@Override
public void ClearStack() {
if(top>-1){
for(int i=0;i<top;i++){
objArray[i]=null;
}
}
}
}
三、测试代码
package Statck;
import java.util.Random;
public class TestStack {
MStack<Integer> stack ;
final int MAXVALUE=15;
Random r = new Random();
public static void main(String[] args){
TestStack ts = new TestStack();
ts.initStack(10);
ts.pushData();
}
/**
* 初始化,
* @param length 栈长度
*/
private void initStack(int length){
stack = new MStack<Integer>(length);
}
/**
* 压栈——弹栈——显示
*/
private void pushData(){
int length = Math.abs(r.nextInt(MAXVALUE));//Math.abs()取绝对值
try{
System.out.println("压入元素:");
for(int i=0;i<length;i++){
int j = Math.abs(r.nextInt(MAXVALUE));
System.out.print(" "+j);
stack.push(j);
}
}catch(Exception e){System.out.println(e.toString());}
showStackData(stack);
}
/**
* 显示
* @param stack
*/
private void showStackData(MStack<Integer> stack){
System.out.println("");
System.out.println("栈长:"+stack.StackLength());
System.out.println("栈内元素为(出栈顺序):");
int length = stack.StackLength();
for(int i=0;i<length;i++){
System.out.print(" "+stack.Pop());
}
}
}
四、测试结果
压入元素:
13 10 3 3 9 7 3 12 4 10 10java.lang.RuntimeException: 超出栈上线
栈长:10
栈内元素为(出栈顺序):
10 4 12 3 7 9 3 3 10 13
top来指示栈顶元素在数组中的位置,top初始值为-1,表示栈为空,top=0表示已经有一个元素
(top==MAXSIZE-1)为栈满标志