栈的特点
栈(Stack)又称堆栈,是一种基于后进先出(LOFO)策略的集合类型。是限制在表的一端进行插入删除运算的线性表。栈可以用来在函数调用时存储断点,做递归时要用到栈。
通常将能够进行插入和删除运算的这一端称为栈顶,另一端称为栈底。当表中没有元素时称为空栈。
栈的常用运算:
Pop():弹出操作,每次删除操作。
Push():压入操作,将数据插进栈中。
isFull():判断当前栈是否是空栈。
isEmpty():判断当前栈是否已满。
Pick():得到栈顶元素的值,但不能出栈。
Size():得到当前栈中的元素个数。
栈的实现
我们通过数组来实现一个简单的栈。在顺序存储下,需要考虑堆栈的上溢。这是一种出错的状态,应该避免它。
栈的初始化:初始化一个大小为maxSize的数组,因为在栈中我们只在一端进行运算,所以我们只定义一个栈 顶。并将它初始化为-1;
入栈:先将栈顶+1,然后将数据压入栈中。
出栈:先定义一个中间变量,将栈顶指向的数据传入这个中间变量中,然后栈顶-1;

判空:当栈顶指向-1时,是空栈

判满:当栈顶指针指向maxSize-1时,栈满

得到栈顶元素:直接返回栈顶指向的数据

得到栈中元素的个数:栈顶指针减去-1;

显示栈中的数据:栈是一个数组,直接访问数组下标0到栈顶的元素

代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| class ArrayStackString {
private String[] arr;
private int maxSize;
private int pop;
public ArrayStackString(int num){ maxSize = num; pop = -1; arr = new String[maxSize]; }
public boolean isFull(){ return pop == maxSize - 1; } public boolean isEmpty(){ return pop == -1; }
public void push(String n){ if(isFull()){ throw new IllegalStateException("栈已满,无法存入数据"); } arr[++pop] = n; }
public String pop(){ if(isEmpty()){ throw new IllegalStateException("栈空,无法取出数据"); }
String result = arr[pop--]; return result; } public int Size(){ return pop - (-1); } public String pick(){ return arr[pop]; } public void ShowStack(){ if(isEmpty()){ System.out.println("栈空"); }
for (int i = 0; i <= pop ; i++) { System.out.print(arr[i] + "\t"); } System.out.println(); } }
|
测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public static void main(String[] args) {
ArrayStackString arrayStackString = new ArrayStackString(10);
arrayStackString.push("a"); arrayStackString.push("b"); arrayStackString.push("c"); arrayStackString.push("d");
arrayStackString.ShowStack();
arrayStackString.pop(); System.out.println(arrayStackString.Size()); System.out.println(arrayStackString.pick());
arrayStackString.ShowStack(); }
|