栈的顺序存储结构和操作实现
今天学习了一下栈,顺便自己敲代码实现栈的功能,本次是数组实现的。话不多说,看源代码:
定义接口:
package com.guobing.stack;
@SuppressWarnings("hiding")
public interface Stack_Interface<Object> {
public void initStack(); //这个方法貌似可以不要,后面再看看
public void push(Object obj); //向栈顶插入一个元素
public boolean isEmpty(); //判断是否为空
public Object peek(); //返回栈顶元素的值
public Object pop(); //从栈中删除栈顶元素并返回
public void clear(); //清除栈中的所有元素使之成为一个空栈
public void print(); //打印栈中的元素
}
实现接口:
package com.guobing.stack;
public class ArrayStack implements Stack_Interface<Object> {
/**
* 栈的顺序存储结构和操作实现 数组实现
*/
final int minSize = 10; //定义栈需要的变量
private Object [] stackArray;
private int top;
/**
* 清空栈
*/
@Override
public void clear() {
top = -1;
stackArray = null;
}
/**
* 初始化栈
*/
@Override
public void initStack() {
top = -1; //栈的初始值为空,置top为1
stackArray = new Object[minSize]; //数组初始长度
}
/**
* 判断栈是否为空
*/
@Override
public boolean isEmpty() {
return (top == -1);
}
/**
* 返回栈顶元素的值
*/
@Override
public Object peek() {
if(top == -1)
return null;
System.out.println("栈顶元素的值是:" + stackArray[top]);
return stackArray[top];
}
/**
* 从栈中删除栈顶元素并返回
*/
@Override
public Object pop() {
if(top == -1)
return null;
top --; //这种写法比较高效
return stackArray[top + 1];
}
/**
* 用数组实现栈,其实很简单;top就是数组的最后一位
* 所有的操作都是对top的操作,所以虽然有栈底指针,但是没有用到,可以不申明
* 向栈顶压入数据时的分析:
* 数组的长度是固定的。所以当栈空间已经满时,重新申请空间,并把数据复制过去
*/
@Override
public void push(Object obj) {
if(top == stackArray.length - 1) {
Object [] p = new Object[top * 2];
for(int i=0; i<=top; i++) {
p[i] = stackArray[i];
stackArray = p;
}
}
top ++;
stackArray[top] = obj;
}
/**
* 打印栈中的数据
*/
@Override
public void print() {
if(top == -1) {
System.out.println("栈为空");
}
for(int i=top; i>=0; i--) {
System.out.println(stackArray[i]);
}
}
//测试
public static void main(String [] args) {
ArrayStack as = new ArrayStack();
as.initStack();
as.push("a");
as.push("b");
as.push("c");
as.peek();
as.print();
System.out.println("删除栈顶元素后:");
as.pop();
as.peek();
as.print();
as.clear();
as.print();
}
}
测试结果:
栈顶元素的值是:c
c
b
a
删除栈顶元素后:
栈顶元素的值是:b
b
a
栈为空