数据结构(Java笔记)—栈(顺序栈)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40780805/article/details/82805191

栈(Stack)——栈和堆是两个不同的概念,堆是一种特殊的树结构(完全二叉树),而栈在中断处理特别是重要数据的现场保护中具有重要作用;

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针

栈可以用来在函数调用的时候存储断点,做递归时要用到栈!

栈又分为顺序栈与链式栈,此次笔记中记录的是顺序栈的结构定义及操作

栈操作主要有

  1. 定义栈结构(StackType)
  2. 初始化栈(stackInit)
  3. 判断栈的大小(stackSize)
  4. 入栈(Push)
  5. 出栈(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;
			}
		}
	}

猜你喜欢

转载自blog.csdn.net/qq_40780805/article/details/82805191