堆栈和队列
堆栈和队列都是特殊的线性表。即,除了第一个元素和最后一个元素之外的其他元素只有一个前继元素和一个后继元素。
区别在于:线性表的插入和删除不受限制,而堆栈和队列的插入和删除则有一些特殊要求。具体下文将给出答案。
堆栈
- 类似弹夹一样的结构,只允许一端进行插入和删除操作。
- 允许插入和删除的一端称为栈顶,另一端称为栈低。
- 插入称为入栈或进栈,删除称为出栈或退栈。
- 后进入堆栈的元素,总是最先退出堆栈的。
堆栈的抽象数据类型
- 操作集合
- 入栈push(Object obj):将数据元素obj入栈
- 出栈pop():将栈顶元素出栈
- 取栈顶数据元素getTop():取出栈顶的数据元素
- 非空堆栈notEmpty():非空堆栈则返回true。否则,反之。
- 抽象数据类型接口
public interface Stack{
public void push(Object obj)throws Exception;
public void pop()throws Exception;
public Object getTop()throws Exception;
public boolean notEmpty()throws Exception;
}
- 堆栈存取特点
- 先插入元素,后移动"指针"
- 先移动"指针",后退出元素。
顺序堆栈
public class SeqStack implements Stack {
/*
* 1、defaultSize:默认大小
* 2、top:栈顶位置
* 3、stack:堆栈数组对象
* 4、maxStackSize:最大存放数据元素
*/
final int defaultSize = 10;
int top;
Object[] stack;
int maxStackSize;
public SeqStack() {
initiate(defaultSize);
}
public SeqStack(int i) {
initiate(i);
}
public void initiate(int sz) {
maxStackSize = sz;
top = 0;
stack = new Object[sz];
}
@Override
public void push(Object obj) throws Exception {
// 入栈
if(top == maxStackSize) {
throw new Exception("堆栈已满!");
}
stack[top] = obj;
top++;
}
@Override
public Object pop() throws Exception {
// 退栈
if(top == 0) {
throw new Exception("堆栈已空!");
}
top--;
return stack[top];
}
@Override
public Object getTop() throws Exception {
// 取栈顶元素
return stack[top-1];
}
@Override
public boolean notEmpty() throws Exception {
// 非空堆栈
return top>0;
}
}
链式堆栈
- 链式堆栈需要一个节点类如下:
public class Node{
/*
*1、next 指向下一个节点
*2、data 存放元素
*/
Node next;
Object obj;
//用于头节点的构造方法
public Node(Node nextval){
next = nextval
}
//用于其他节点的构造方法
public Node(Node nextval,Object obj){
next = nextval;
data = obj;
}
public Node getNext(){
return next;
}
public void setNext(Node nextval){
next = nextval;
}
public Object getElement(){
return data;
}
public void setElement(Object obj){
data = obj;
}
}
- 链式队列
public class LinStack implements Stack {
/*
* 1、head //栈顶节点
* 2、size //结点个数
*/
Node head;
int size;
public LinStack() {
head = null;
size = 0;
}
@Override
public void push(Object obj) throws Exception {
// 入栈
head = new Node(obj,head);
size++;
}
@Override
public Object pop() throws Exception {
// 退栈
if(size == 0) {
throw new Exception("堆栈已空");
}
Object obj = head.getElement()