版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40780805/article/details/82805191
栈(Stack)——栈和堆是两个不同的概念,堆是一种特殊的树结构(完全二叉树),而栈在中断处理特别是重要数据的现场保护中具有重要作用;
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈又分为顺序栈与链式栈,此次笔记中记录的是顺序栈的结构定义及操作
栈操作主要有
- 定义栈结构(StackType)
- 初始化栈(stackInit)
- 判断栈的大小(stackSize)
- 入栈(Push)
- 出栈(Pop)
入栈:
- 判断栈顶(top),top大于MAXLEN表示栈溢出,进行错误处理,否则执行下一步;
- 将入栈元素保存到top指向的位置;
- top增一;
出栈:
- 判断栈顶(top),top等于0表示栈为空,进行空栈处理,否则执行下一步;
- 返回top-1指向的元素;
- top减一;
代码实现:
一,定义结点
public class Data {//定义结点
String name;
int age;
}
二,栈结构实现
public class Stack {
StackType s;//定义全局头引用
class StackType{//定义栈结构——顺序栈
static final int MAXLEN=20;
Data[] data=new Data[MAXLEN];
int top;
}
void stackInit(){//初始化栈结构
if((s=new StackType())!=null){
s.top=0;
}
}
int stackSize(){//判断栈的大小
return s.top;
}
int stackPush(Data d){//入栈
if(s.top>=s.MAXLEN){
System.out.println("栈溢出");
return 0;
}
s.data[s.top++]=d;
return 1;
}
Data stackPop(){//出栈
if(s.top<=0){
System.out.println("栈为空");
return null;
}
return s.data[--s.top];
}
}
三,运行测试
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
Stack dt=new Stack();
dt.stackInit();
while(true){
System.out.println("请输入:0(退出),1(入栈),2(出栈),3(栈大小)");
int i=in.nextInt();
switch (i) {
case 0:
return;
case 1:
Data d=new Data();
System.out.print("添加姓名:");
String name=in.next();
System.out.print("添加年龄:");
int age=in.nextInt();
if(name==null||age==0){
System.out.println("信息不能为空");
break;
}
d.age=age;
d.name=name;
int temp1=dt.stackPush(d);
if(temp1==0){
System.out.println("入栈失败");
break;
}System.out.println("入栈成功");
break;
case 2:
Data data=dt.stackPop();
if(data==null){
System.out.println("出栈失败");
break;
}System.out.println("出栈成功");
System.out.println("姓名:"+data.name+""+"年龄:"+data.age);
break;
case 3:
System.out.println("栈的大小为:"+dt.stackSize());
break;
default:
break;
}
}
}