栈是一种运算受限的线性表。其限制是仅允许在表尾进行插入或者删除操作。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应的,表头端称为栈底(bottom)。不含元素的空表称为空栈。
假设栈 S=(a1,a2,…,an),则称 a1 为栈底元素,an为栈顶元素。栈中的元素按a1,a2,…,an的次序进栈,退栈的第一个元素为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的(如下图)。因此,栈又称为后进先出的线性表。
栈的底层实现
栈的基本操作有在栈顶进行插入(入栈)和删除(出栈),栈的初始化,判空及取栈顶元素等。下面将一一实现。
- void push(int element) 入栈
- int pop() 栈顶元素出栈,且返回出栈元素的值
- int peek() 获取栈顶元素的值
- boolean isEmpty() 判断栈是否为空
- void showstack() 遍历栈(自栈顶到栈尾)
package util;
public class MyStack {
//栈的底层使用数组来存储数据
int[] elements;
public MyStack() {
elements = new int[0];
}
//压入元素
public void push(int element) {
int[] newarr = new int[elements.length+1];
for(int i=0;i<elements.length;i++) {
newarr[i] = elements[i];
}
newarr[elements.length] = element;
elements = newarr;
}
//取出栈顶元素
public int pop() {
if(elements.length==0) {
throw new RuntimeException("stack is empty");
}
int element = elements[elements.length-1];
int[] newarr = new int[elements.length-1];
for(int i=0;i<newarr.length;i++) {
newarr[i] = elements[i];
}
elements = newarr;
return element;
}
//查看栈顶元素
public int peek() {
if(elements.length==0) {
throw new RuntimeException("stack is empty");
}
return elements[elements.length-1];
}
//判断栈是否为空
public boolean isEmpty() {
return elements.length==0?true:false;
}
//遍历栈(自栈顶到栈底)
public void showstack() {
if(elements.length==0) {
throw new RuntimeException("stack is empty");
}
for(int i=elements.length-1;i>=0;i--) {
System.out.print(elements[i]+" ");
}
}
}
简单Test:
package classify;
import util.MyStack;
public class StackTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个栈
MyStack stack = new MyStack();
//将元素压入栈中
stack.push(99);
stack.push(88);
stack.push(77);
stack.push(66);
stack.push(55);
//查看栈顶元素
System.out.println(stack.peek()); //55
//取出栈顶元素
System.out.println(stack.pop()); //55
System.out.println(stack.peek()); //66
//判断栈是否为空
System.out.println(stack.isEmpty()); //false
//遍历栈(自栈顶到栈底)
stack.showstack(); //66 77 88 99
}
}