目录:
1.栈的特点
栈(stack)是限定仅仅在表尾进行插入或删除的线性表。表尾称为栈顶(top),表头端称为栈底(base)。
栈就是对日常生活中“先进后出”这一现象的抽象,能够帮助我们将许多实际问题抽象成数据结构来解决问题,比如铁路调度,递归调用的实现。
2.栈的抽象数据类型(ADT)
将栈的操作抽象为一个接口,规范后续的顺序栈与链栈,包括栈空的判定、栈的长度、取栈顶元素、入栈、出栈以及栈的遍历。
public interface MyStack {
public void clearStack();
public boolean isEmpty();
public int stackLength();
public ElemType getTop();
public void push(ElemType e);
public void pop();
public void traverse();
}
备注:栈的数据元素,以及链栈的结点如图:
详细代码请见
3.顺序栈的实现
3.1顺序栈的存储结构与初始化
与顺序表一样,顺序栈用规定大小的ElemType数组来存储数据,存取时,以栈顶top为下标进行操作。
初始化时,调用含参构造方法,初始化以maxSize为最大长度的顺序栈。
public class SqStack implements MyStack {
private int maxLength;//
final private int base=0;
private int top;
ElemType[] stack;
public SqStack(int maxSize){
maxLength=maxSize;
stack=new ElemType[maxSize];
}
/*栈的相关方法见下文*/
}
3.2顺序栈的入栈和出栈
入栈:
- stack[top]=e;
- top++;
出栈:
- top- -;(我们只关心base到top-1之间的数据,所以并不需要更改top处的值,只需要让top自减)
Java代码:
@Override
public void push(ElemType e) {
stack[top]=e;
top++;
}
@Override
public void pop() {
top--;
}
3.3顺序栈的其他方法
栈空的判断、清空栈、栈内数据的长度以及栈的遍历代码如下:
@Override
public void clearStack() {
top=base;
}
@Override
public boolean isEmpty() {
return top==base;
}
@Override
public int stackLength() {
return top;
}
@Override
public void traverse() {
System.out.print("当前栈内元素:");
for(int i=0;i<top;i++){
System.out.print(stack[i]+" ");
}
System.out.println();
}
4.链栈的实现
4.1链栈的存储结构与初始化
与链表一样,链栈用一个LinkNode结点来存储数据,由于出入栈都在栈顶,把链表的头结点作为栈顶比较方便。
public class LinkStack implements MyStack {
private LinkNode linkStack;
public LinkStack(){
linkStack=new LinkNode();
}
/*栈的相关方法见下文*/
}
4.2链栈的入栈和出栈
入栈
出栈
@Override
public void push(ElemType e) {
LinkNode p=new LinkNode(e);
p.setNext(linkStack);
linkStack=p;
}
@Override
public void pop() {
linkStack=linkStack.getNext();
}
4.3链栈的其他方法
栈空的判断、清空栈、栈内数据的长度以及栈的遍历代码与链表相似,如下:
@Override
public void clearStack() {
linkStack.setNext(null);
}
@Override
public boolean isEmpty() {
return linkStack.getNext()==null;
}
@Override
public int stackLength() {
LinkNode p=linkStack;
int i;
for(i=0;p.getNext()!=null;i++){
p=p.getNext();
}
return i;
}
@Override
public ElemType getTop() {
return linkStack.getE();
}
@Override
public void traverse() {
LinkNode p=linkStack;
System.out.print("当前栈内元素:");
System.out.print(p.getE().toString());
p=p.getNext();
while(p.getNext()!=null){
System.out.print(" -> ");
System.out.print(p.getE().toString());
p=p.getNext();
}
System.out.println();
}