A:栈抽象数据类型
1.栈的主要操作
void push(int data);将data数据插入栈中。
int pop();删除并返回最后一个插入栈的元素.
2.栈的辅助操作
int top();返回最后一个插入栈的元素,但是不删除
int size();返回存储在栈中元素的个数
int isEmpty();判断栈中是否有元素
int isStackFull();判断栈中是否存满元素
B:栈中的异常
在栈为空时pop操作和top操作都会抛出异常。在栈为满的时候执行push操作也会抛出异常。
C:栈的实现
1:基于简单数组的实现方法
2:基于动态数组的实现方法
3:基于链表的实现方法
1:简单数组实现
如图所示:从左到右向数组中添加所有的元素,并且定义一个变量用来记录数组当前栈顶元素的下标
s |top(栈顶)
当数组中存满了栈元素的时候,执行入栈操作就会抛出栈满的异常,当对一个空栈执行删除元素的操作,就会抛出栈空异常。
代码如下:
package airycode; public class ArrayStack { private int top; private int capacity; private int[] array; public ArrayStack(){ capacity = 1; array = new int[capacity]; top = -1; } public boolean isEmpty(){ return top == -1; } public boolean isStackFull(){ return top == capacity-1; } public void push(int data){ if(isStackFull()){ System.out.println("Stack Overflow"); } else { array[++top] = data; } } public int pop(){ if (isEmpty()) { System.out.println("Stack is Empty"); return 0; } else { return array[top--]; } } public void deleteStack(){ top = -1; } }
性能和局限性
性能分析:假设n为栈中元素的个数。在基于简单数组的栈实现中。各种栈操作算法复杂度如下表所示:
空间复杂度(用于n次push操作) | O(n) | isEmpty()的时间复杂度 | O(1) |
push()的时间复杂度 | O(1) | isStackFull()的时间复杂度 | O(1) |
pop()的时间复杂度 | O(1) | deleteStack()的时间复杂度 | O(1) |
size()时间复杂度 | O(1) |
局限性:栈的最大空间必须预先声明且不能改变。试图对一个满栈执行入栈操作将产生一个针对简单数组这种特定实现栈方式的异常。