因为我是做编译的,工作中每天玩的最多的数据结构就是栈和树,玩的最多的算法就是递归,栈这种结构还是很好理解的,下面是百度百科对于栈的解释:
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。
栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
以上定义是在经典计算机科学中的解释。
在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。
栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:
- 1.函数的返回地址和参数
- 2. 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
下面这种方式用的是线性方式,也就是用数组实现的,也可以用链表:
public class IStack<E> {
private Object[] elementData;
private int maxSize;// 栈的最大容量
private int top;// 栈顶指针
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
public IStack() {
this(10);
}
public IStack(int initialCapacity) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
top = -1;
this.maxSize = initialCapacity;
elementData = new Object[maxSize];
}
// 压入数据
public void push(Object value) {
isGrow(top + 1);
elementData[++top] = value;
}
/**
* 是否需要扩容,如果需要,扩大原来的二分之一
*
* @param minCapacity
* @return
*/
public void isGrow(int minCapacity) {
int oldCapacity = maxSize;
// 如果当前元素压入栈之后总容量大于前面定义的容量,则需要扩容
if (minCapacity >= oldCapacity) {
// 扩大原来的二分之一
int newCapacity = oldCapacity + (oldCapacity >> 1);
newCapacity = (newCapacity > MAX_ARRAY_SIZE) ? MAX_ARRAY_SIZE : newCapacity;
this.maxSize = newCapacity;
elementData = Arrays.copyOf(elementData, maxSize);
}
}
// 弹出栈顶数据
public Object pop() {
return elementData[top--];
}
// 访问栈顶数据
public Object peek() {
return elementData[top];
}
// 判断栈是否为空
public boolean isEmpty() {
return (top == -1);
}
}
下面是将一个字符串反转的实例:
IStack<Character> charStack = new IStack<Character>();
String str = "my name is huangqiqi!";
char[] charArray = str.toCharArray();
for (char c : charArray)
charStack.push(c);
while (!charStack.isEmpty())
System.out.print(charStack.pop());//!iqiqgnauh si eman ym
这里有几道之前秋招时整理的栈的算法题,感兴趣可以看看:https://blog.csdn.net/qq_42570601/article/details/97687138