一、栈
1、介绍
栈是一种先进后出的线性表,它要求只能在表尾(栈顶)进行插入和删除操作。可以用数组或链表来实现,一般用顺序表来实现。
栈的应用:
①子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
②处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
③表达式的转换(中缀表达式转后缀表达式)与求值(实际解决)。
④二叉树的遍历。
⑤图的深度优先(depth一first)搜索。
2、栈的顺序存储实现
顾名思义,用顺序表的方法实现,通常用数组。栈的顺序存储结构:
代码示例:数组实现栈
1 // 用数组实现栈 2 public class MyStack<T> { 3 private T[] elementData; 4 // 栈顶指针 5 private int top; 6 7 public MyStack(int initialCapacity) { 8 elementData = (T[]) new Object[initialCapacity]; 9 top = 0; 10 } 11 12 // 入栈 13 public T push(T item) { 14 if (isFull()) { 15 throw new RuntimeException("堆栈溢出~"); 16 } 17 18 elementData[top] = item; 19 top++; 20 21 return item; 22 } 23 24 // 出栈 25 public T pop() { 26 if (empty()) { 27 return null; 28 } 29 30 top--; 31 return elementData[top]; 32 } 33 34 // 读取栈顶元素 35 public T peek() { 36 if (empty()) { 37 return null; 38 } 39 40 return elementData[top - 1]; 41 } 42 43 // 判空 44 public boolean empty() { 45 return top == 0; 46 } 47 48 // 判满 49 private boolean isFull() { 50 return top == elementData.length; 51 } 52 53 // 栈的元素个数 54 public int size() { 55 int count = 0; 56 for (int i = top - 1; i >= 0; i++) { 57 count++; 58 } 59 return count; 60 } 61 62 @Override 63 public String toString() { 64 if (empty()) { 65 return "[]"; 66 } 67 68 StringBuilder builder = new StringBuilder(); 69 builder.append("["); 70 for (int i = top - 1; i >= 0; i--) { 71 builder.append(elementData[i]) 72 .append(","); 73 } 74 75 // 去掉最后一个, 76 builder.deleteCharAt(builder.length() - 1); 77 builder.append("]"); 78 79 return builder.toString(); 80 } 81 }