一、栈

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 }
数组实现栈

相关文章: