Java实现栈的顺序存储和链式存储
栈的特点是后进先出,栈的插入和删除操作受限制,栈的插入和删除操作只允许在线性表的一端操作。
栈中插入数据元素的过程为入栈(push),删除数据元素的过程称为出栈(pop).当栈中没有数据元素时称之为空栈。允许操作的一端称为栈顶-top,不允许操作的一端称为栈底bottom
栈的基本操作
1、栈的初始化,设置栈状态为空
2、判断栈的状态是否为空
3、判断栈的状态是否已满
4、入栈:入栈过程中必须要判断栈的状态,如果栈不满则接受新数据元素入栈,否则产生上溢错误overflow
5、出栈:在出栈之前也必须判断栈的状态,如果栈的状态为空,产生下溢错误underflow
6、获得栈顶数据元素,此时该数据元素未出栈
栈的顺序栈的基本操作
package cn.chen.stack;
/**
* 实现栈的顺序存储
*
* @author 等风来
* */
public class Stack {
//定义一个数组
private Object table[];
//定义一个栈顶指针
private int top;
public Stack(int size){
//为table数组申请空间
table = new Object[size];
//给top指针赋初值
top = -1;
}
public Stack(){
//如果没有指定table数组的长度,则默认调用有参的构造方法
this(25);
}
//判断栈是否为空、
public boolean isEmpty(){
//如果top任然为-1则证明栈为空栈
return top == -1;
}
//判断栈是否已满
public boolean isFull(){
//如果top大于数组长度则代表栈已满
return top >= table.length;
}
//入栈
public boolean push(Object obj){
//判断栈是否已满
if(!isFull()){
//栈顶指针自加
top++;
//将obj存储到下标为top的数组
table[top] = obj;
return true;
}
System.out.println("栈已满,"+obj+"无法入栈");
return false;
}
//出栈
public Object pop(){
//定义一个变量用于接收出栈的元素
Object obj = null;
//如果栈非空则让栈顶元素出栈
if(!isEmpty()){
//取得栈顶元素
obj = table[top];
//清空当前栈顶元素
table[top] = null;
//栈顶指针自剪
top -- ;
//返回obj
return obj;
}
//如果栈顶为空则返回null
return null;
}
public static void main(String[] args) {
//创建对象
Stack s = new Stack();
//入栈
for(int i = 1; i <= 3; i++){
s.push(i);
}
//出栈
for(int i = 1; i <= 3; i++){
System.out.println(s.pop());
}
}
}
栈的链式储存代码
package cn.chen.stack;
import cn.chen.exercise.Node;
public class stack_chained {
//定义一个栈顶指针
private Node top;
//构造方法初始化
public stack_chained(){
top = null;
}
//判断栈是否为空
public boolean isEmpty(){
return top == null;
}
//入栈
public boolean push(int k){
//将k构建成节点
Node n = new Node(k);
//将节点串联起来
n.setNext(top);
//将top上移
top = n;
return true;
}
//出栈
public int pop(){
//定义一个变量用于接收出栈元素
int k = -1;
//判断栈是否为空
if(!isEmpty()){
//接收栈顶元素
k = top.getData();
//top下移
top = top.getNext();
}
return k;
}
//获取栈顶元素
public int get(){
//定义一个变量用于接收出栈元素
int k = -1;
//判断栈是否为空
if(!isEmpty()){
//接收栈顶元素
k = top.getData();
}
return k;
}
public static void main(String[] args) {
stack_chained s = new stack_chained();
//入栈
System.out.print("入栈中");
for(int i = 1; i < 4; i++){
System.out.print(".");
s.push(i);
}
System.out.println("出栈");
while(!s.isEmpty()){
//获取栈顶元素
System.out.print("\n栈顶元素为:");
System.out.print(s.get());
System.out.println("\t"+s.pop());
}
}
}