栈的实现

栈的特点

栈(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(); // a b c d

arrayStackString.pop();
System.out.println(arrayStackString.Size()); //3
System.out.println(arrayStackString.pick()); //c

arrayStackString.ShowStack(); //a b c
}

栈的实现
https://johnjoyjzw.github.io/2020/01/06/栈的实现/
Author
John Joy
Posted on
January 6, 2020
Licensed under