栈
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。
这一端被称为栈顶,相对地,把另一端称为栈底。
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

特征
一种遵从后进先出(LIFO)原则的有序集合,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作
手撸代码
入栈
空栈时,顶针top为-1,入栈时则需要先移动顶针top,再进行入栈操作
public void push(int x) {
if (this.isFull()) {
System.out.println("栈满了!");
return;
}
this.stack[++this.top] = x;
System.out.println("【" + x + "】进入栈!");
}
出栈
出栈时,则需要先拿出栈顶数据再进行移动顶针top
public void pop() {
if (this.isEmpty()) {
System.out.println("栈已空!");
return;
}
System.out.println( "已出栈:【" + this.stack[this.top--] +"】");
}
完整例子
public class NewStack {
private int top = -1;
private int size = 0;
private int[] stack;
public NewStack(int length) {
this.stack = new int[length];
this.size = length;
}
public boolean isEmpty() {
return this.top == -1;
}
public boolean isFull() {
return this.top == this.size - 1;
}
public void push(int x) {
if (this.isFull()) {
System.out.println("栈满了!");
return;
}
this.stack[++this.top] = x;
System.out.println("【" + x + "】进入栈!");
}
public void pop() {
if (this.isEmpty()) {
System.out.println("栈已空!");
return;
}
System.out.println( "已出栈:【" + this.stack[this.top--] +"】");
}
public void showQueue() {
System.out.print("打印栈!栈顶:");
for (int i = this.top; i >= 0; i--) {
System.out.print(this.stack[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
NewStack newStack = new NewStack(6);
int x = 6;
while (x>0) {
newStack.push(x%2);
x = x/2;
}
newStack.showQueue();
}
}
总结
上面的例子用的是十进制转二进制来演示的
将十进制N每次取余的值放入栈低
N每次除于2的值进行下次循环
直到N为0截止
再将结果从栈中获取出来得到二进制的值
适用场景
- 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,回到原来的程序中
- 处理递归调用:只是除了存储下一个指令的地址外,也将参数、区域变量等数据存入堆栈。
- 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)
- 二叉树的遍历
- 图的深度优先搜素法