一、分析
栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表。
顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
一个标准的顺序栈具有如下基本操作:
1、初始化顺序栈
2、销毁顺序栈
3、清空顺序栈
4、检测顺序栈是否为空
5、返回顺序栈中的元素个数
6、返回顺序栈的栈顶元素,不修改栈顶指针
7、向顺序栈顶中压入元素
8、从顺序栈顶中弹出元素
9、从栈底到栈顶遍历顺序栈
在Java中,可以将整个顺序栈定义成一个类,类中定义有一个数组类型的属性表示顺序存储结构来存储元素,再定义一个int类型的属性top来作为指针指示栈顶元素在数组中的位置,顺序栈的基本操作则定义成类的方法。初始化顺序栈即实例化类,销毁顺序栈即销毁实例化出来的对象。
二、实现
1、定义类属性和构造函数
1 class InitStack{ 2 3 private int [] stack = null; //存储元素 4 5 private int top = 0; //指示栈顶元素在顺序栈中的位置 6 7 public InitStack(int max) { //初始化自定义大小的顺序栈 8 this.stack = new int[max]; 9 } 10 }
2、清空顺序栈
1 public void clearStack() { 2 this.top = 0; //直接令栈顶指针指向栈底即可 3 }
3、检测顺序栈是否为空
1 public boolean stackEmpty() { 2 if(this.top == 0) { //检测栈顶指针是否指向栈底即可 3 return true; 4 }else { 5 return false; 6 } 7 }
4、返回顺序栈中的元素个数
1 public int stackLength() { 2 return this.top; //栈顶指针的值即代表了元素个数 3 }
5、返回顺序栈的栈顶元素,不修改栈顶指针
1 public int [] getTop() { 2 3 if (this.top == 0) { //如果顺序栈为空,则返回空 4 return null; 5 } 6 7 int [] i = new int[1]; 8 i[0] = stack[this.top - 1]; //获取栈顶元素 9 10 return i; 11 }
6、向顺序栈顶中压入元素
1 public boolean push(int value) { 2 3 if(this.top == this.stack.length) { //判断顺序栈是否已满 4 return false; 5 } 6 7 this.stack[this.top] = value; //压入元素 8 this.top++; //栈顶指针加一 9 return true; 10 }
7、从顺序栈顶中弹出元素
1 public int [] pop() { 2 3 if (this.top == 0) { //判断顺序栈是否已空 4 return null; 5 } 6 7 int [] i = new int[1]; 8 this.top--; //栈顶指针减一 9 i[0] = stack[this.top]; //获取栈顶元素 10 return i; 11 }
8、从栈底到栈顶遍历顺序栈
1 public String stackTraverse() { //通过输出顺序栈元素来表示遍历 2 3 String s = ""; //存储要输出的元素 4 5 for (int i = 0; i < this.top; i++) { //循环遍历 6 s += this.stack[i] + "、"; 7 } 8 9 if(s.length() == 0) { //如果未获取到元素,返回空字符串 10 return s; 11 } 12 13 return s.substring(0,s.length() - 1); //除去最后一个顿号后返回 14 }
三、小结
以上就是顺序栈用Java的实现,由于只定义了整数的数组,因此只能操作整数数据,但顺序栈的基本思想都已实现。