什么是栈(stack)
栈是一种特殊的线性表,限定值能在表的一端进行插入和删除操作,俗称“后进先出”(FILO)。
操作数据的这段是表头,称为栈顶;相应的,表尾称为栈底。不含任何元素的栈称为空栈。
栈的基本操作:
push:压栈或入栈操作。
pop:弹栈或出栈操作
peek:查看栈顶数据,而不弹出数据,也就是不做出栈操作。
代码实现:
package datastrucates.arrays.stack;
/**
* 自定义栈
* @author wuxin
*
*/
public class MyStack {
private int [] stackData;//存放栈的数据
private int topIndex=-1; //顶层索引
public MyStack(int length) {
stackData=new int[length];
}
/**
* 压栈操作
* @param data
*/
private void push(int data) {
topIndex++;
stackData[topIndex]=data;
}
/**
*弹栈操作
* @return
*/
private int pop() {
int temp=stackData[topIndex];
topIndex--;
return temp;
}
/**
* 查看栈顶操作
* @return
*/
private int peek() {
return stackData[topIndex];
}
/**
* 判断栈是否为空栈
* @return
*/
private boolean isEmpty() {
return stackData.length==-1;
}
/**
* 判断栈是否已满
* @return
*/
private boolean isFull() {
return topIndex==(stackData.length-1);
}
private void printData() {
System.out.println("======================");
for(int i=0;i<=topIndex;i++){
System.out.println(stackData[i]);
}
}
public static void main(String[] args) {
MyStack stack=new MyStack(5);
stack.push(1);
stack.push(3);
stack.push(6);
stack.push(5);
stack.push(8);
stack.printData();
System.out.println("ret--->"+stack.peek());
stack.pop();
stack.printData();
}
}
运行结果:
这里非常有必要说明的是 弹栈并不会减少数组中元素值,只是减少对数组值的指针引用。所以我们上面的代码 经过弹栈之后,数组中的值依然是1,3,6,5,8 只是,栈的顶部索引引用减少了一次,指向了5 而不是8
所以我们可以简单理解为下面的图形
开始:
经过一次弹栈:
从此 我们更能明显的看出来,栈的弹出操作。如果弹出之后再重新压栈,栈的顶部指引将是最新的元素,
运行结果: