继上一篇讲完链表之后,这篇开始我讲堆栈相关内容
顺序堆栈
堆栈有其线性结构和离散结构,其都有数据集合和操作集合
一、定义操作堆栈的功能接口
(1)入栈push(obj):把数据元素obj插入堆栈。
(2)出栈pop():出栈, 删除的数据元素由函数返回。
(3)取栈顶数据元素getTop():取堆栈当前栈顶的数据元素并由函数返回。
(4)非空否notEmpty():若堆栈非空则函数返回true,否则函数返回false。
二、定义队列逻辑类,实现逻辑
定义功能接口Stack_,在下文链式堆栈当中同样会用到该接口
public interface Stack_ {
/**
* 入栈
*/
void push(Object object) throws Exception;
/**
* 出桟
*/
Object pop() throws Exception;
/**
* 获得桟顶元素
*/
Object getTop() throws Exception;
/**
* 判断是否为空
*/
boolean isEmpty();
}
实现顺序堆栈逻辑,当中实现接口功能stack_
/**
* 顺序桟
*
* @author robert
*
*/
public class SequenceStack_ implements Stack_ {
private static final int defaultsize = 10;
public int mTop;
int mMaxsize;
private Object[] mStack;
public SequenceStack_() {
init(defaultsize);
}
public SequenceStack_(int size) {
init(size);
}
public void init(int size) {
this.mMaxsize = size;
this.mTop = 0;
mStack = new Object[size];
}
@Override
public void push(Object object) throws Exception {
// TODO Auto-generated method stub
if (mTop == mMaxsize) {
throw new Exception("enman");
}
mStack[mTop] = object;
mTop++;
}
@Override
public Object pop() throws Exception {
if (isEmpty()) {
throw new Exception("null");
}
mTop--;
return mStack[mTop];
}
@Override
public Object getTop() throws Exception {
if (mTop == mMaxsize) {
throw new Exception("enman");
}
return mStack[mTop - 1];
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return mTop == 0;
}
}
测试类
public class Test_stack {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
SequenceStack_ stack = new SequenceStack_(10);
Scanner in = new Scanner(System.in);
int temp;
for (int i = 0; i < 10; i++) {
System.out.println("请输入第" + (i + 1) + "个整数:");
temp = in.nextInt();
stack.push(temp);
}
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
}
}
结果:
链式堆栈
功能接口同样使用上文的stack_接口
抽象数据类型结点类LinkStack_Node
//结点类
public class LinkStack_Node {
Object element; // 数据域
LinkStack_Node next; // 指针域
// 头结点的构造方法
public LinkStack_Node(LinkStack_Node nextval) {
this.next = nextval;
}
// 非头结点的构造方法
public LinkStack_Node(Object obj, LinkStack_Node nextval) {
this.element = obj;
this.next = nextval;
}
// 获得当前结点的后继结点
public LinkStack_Node getNext() {
return this.next;
}
// 获得当前的数据域的值
public Object getElement() {
return this.element;
}
// 设置当前结点的指针域
public void setNext(LinkStack_Node nextval) {
this.next = nextval;
}
// 设置当前结点的数据域
public void setElement(Object obj) {
this.element = obj;
}
public String toString() {
return this.element.toString();
}
}
功能逻辑类的代码
/**
* 链式桟
*
* @author robert
*
*/
public class LinkStack_ implements LStack_ {
LinkStack_Node mhead;// 栈顶指针
int msize;// 节点个数
public LinkStack_() {
this.mhead = null;
this.msize = 0;
}
@Override
public void push(Object object) throws Exception {
mhead = new LinkStack_Node(object, mhead);
msize++;
}
@Override
public Object pop() throws Exception {
if(isEmpty()){
throw new Exception("null");
}
Object value = mhead.getElement();
mhead = mhead.getNext();
msize--;
return value;
}
@Override
public Object getTop() throws Exception {
return mhead.getElement();
}
@Override
public boolean isEmpty() {
return mhead == null;
}
}
测试类:
public class Test_LinkStack {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
LinkStack_ stack = new LinkStack_();
Scanner in = new Scanner(System.in);
int temp;
for (int i = 0; i < 10; i++) {
System.out.println("请输入第" + (i + 1) + "个整数:");
temp = in.nextInt();
stack.push(temp);
}
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
}
}
结果: