先了解一下原理
栈是限制插入和删除只能在一个位置上进行的线性表。其中,允许插入和删除的一端位于表的末端,叫做栈顶(top),不允许插入和删除的另一端叫做栈底(bottom)。对栈的基本操作有 PUSH(压栈)和 POP (出栈),前者相当于表的插入操作(向栈顶插入一个元素),后者则是删除操作(删除一个栈顶元素)。栈是一种后进先出(LIFO)的数据结构,最先被删除的是最近压栈的元素。
主要有两种方式,链表实现和数组实现。
来写一个代码 模拟入栈出栈
public class ArrayStack {
//定义栈的大小为10,top=-1代表栈目前没有元素
private int maxStack;
private int top = -1;
//用数组来模拟栈
private int[] stack;
/**
* 初始化栈
* @param maxStack 栈的大小
*/
public ArrayStack(int maxStack) {
this.maxStack = maxStack;
this.stack = new int[this.maxStack];
}
/**
* 入栈
*/
public void push(int value){
if (isFull()) {
throw new RuntimeException("栈已满");
}
top++;
stack[top] = value;
}
/**
* 出栈
*/
public int pop(){
if (isEmpty()) {
throw new NullPointerException("栈已空");
}
int value = stack[top];
top--;
return value;
}
/**
* 判断是否为空
* @return
*/
public boolean isEmpty(){
return this.top == -1;
}
/**
* 判断是否满栈
* @return
*/
public boolean isFull(){
return this.top == maxStack-1;
}
/**
* 查看栈中数据
*/
public void list(){
if (isEmpty()){
throw new NullPointerException("空栈");
}
for (int i = 0; i < top+1; i++) {
System.out.print(stack[i]+",");
}
}
}
来个Test类测试一下
接下来我们来几个小应用
回文: 一个单词、短语或数字,从前往后写和从后往前写都是一样的。比如,单词“dad”、“racecar”就是回文
思路:我们将拿到的字符串的每个字符按从左至右的顺序压入栈。当字符串中的字符都入栈后,栈内就保存了一个反转后的字符串,最后的字符在栈顶,第一个字符在栈底
那我们怎么入栈出栈进行对比呢
char | charAt(int index) 返回指定索引处的 char 值。 |
我们还要在ArrayStackTest.java中写一个
/**
* 输出数组元素个数
*/
public int length(){
return this.top+1;
}
这个很重要,在pop()方法中,top一直在变化,top--。所以用val.length不行
这个我在代码里也会备注一下,我们直接上代码
public class ArrayStackTest02 {
public static void main(String[] args) {
System.out.println(judement("raar"));
}
/**
* 判断回文数
* @param val 传入字符串
* @return
*/
public static boolean judement(String val){
//初始化栈的大小,以便创建对象
ArrayStack arrayStack1 = new ArrayStack(10);
/**
* 入栈
*/
for (int i = 0; i < val.length(); i++) {
arrayStack1.push(val.charAt(i));
}
/**
* 出栈
*/
String newVal = "";
//最关键的一步,length放在for循环中,在pop方法中会top--,先提取出来
int length = arrayStack1.length();
for (int i = 0; i < length; i++) {
if (!arrayStack1.isEmpty()) {
//返回的是int类型,需要转型
char val1 = (char)arrayStack1.pop();
newVal = newVal + val1;
}
}
if (newVal.equals(val)) {
return true;
}
return false;
}
}
当然我们还可以加上用户输入输出功能,显得系统更完善
再来个例子放在下一篇文章讲,都会放在专栏里面