当前位置:网站首页>学习栈的心得和总结(数组实现)

学习栈的心得和总结(数组实现)

2022-08-09 09:10:00 羽化登仙°

堆栈(英语:stack)又称为栈或堆叠,是计算机科学中的一种抽象数据类型,只允许在有序的线性数据集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作。
常与另一种有序的线性数据集合队列相提并论。
堆栈常用一维数组或链表来实现。

栈(数组实现)

  • 操作
    堆栈使用两种基本操作:推入(压栈,push)和弹出(弹栈,pop):
  • 推入:将数据放入堆栈顶端,堆栈顶端移到新放入的数据。
    弹出:将堆栈顶端数据移除,堆栈顶端移到移除后的下一笔数据。
  • 栈的简单示意图
    在这里插入图片描述
  • 特点
    堆栈的基本特点:
  • 先入后出,后入先出。
    除头尾节点之外,每个元素有一个前驱,一个后继。

好了,上面简单介绍了栈的含义和栈的特点,下面用代码来实现一下栈。

  1. 首先我们需要创建栈,它的成员变量包括一个要创建栈的最大值,也就是创建数组的最大值,需要一个top指针在最开始的时候指向-1,创建数组stack[],创建构造器来创建栈结构。
class stack{
    
	private int maxNum;
	private int top = -1;
	private int stack[];
	public stack(int num) {
    
		// TODO Auto-generated constructor stub
		this.maxNum = num;
		stack = new int[this.maxNum];
	}
}
  1. 判断栈空和栈满
	//判断栈是否已满
	//因为top最开始指向-1,如果指向了栈空间最大-1的话说明已经指向了栈顶,栈也就是满栈
	public boolean isFull() {
    
		return top == maxNum-1;
	}
	
	//判断栈是否为空,如果top仍然指向-1说明栈没有元素添加进来,仍然是一个空栈
	public boolean isEmpty() {
    
		return top == -1;
	}
  1. 入栈,将元素添加到栈中
public void push(int value) {
    
		//判断栈是否已满
		if (isFull()) {
    
			System.out.println("栈已满!!!");
			return;
		}
		//top由-1指向了栈的第一个位置
		top++;
		//将要入栈的元素入栈
		stack[top] = value;
	}
  1. 出栈,将元素从栈中取出
//出栈
	public int pop() {
    
		//判断栈是否为空
		if (isEmpty()) {
    
			throw new RuntimeException("栈为空,无法出栈!!!");
		}
		//定义一个变量用来接收要出栈的值
		int value;
		value = stack[top];
		//当元素出栈后top移向下一个栈空间
		top--;
		//返回出栈的元素
		return value;
	}
	
  1. 遍历栈中元素(显示栈的情况)
//遍历栈中的元素
	public void showStack() {
    
		if (isEmpty()) {
    
			System.out.println("这是一个空栈");
			return;
		}
		for (int i = top; i >= 0; i--) {
    
			System.out.printf("stack[%d] = %d\n", i, stack[i]);
		}
	}
  1. 测试代码
public class StackDemo {
    

	public static void main(String[] args) {
    
		// TODO Auto-generated method stub
		stack stack1= new stack(3);
		boolean loop = true;
		String key = "";
		Scanner scanner = new Scanner(System.in);
		while(loop) {
    
			System.out.println("show 显示栈中数据情况");
			System.out.println("exit 退出栈");
			System.out.println("push 将数据压入栈");
			System.out.println("pop 将数据出栈");
			System.out.println("请输入要执行的操作!");
			key = scanner.next();
			switch (key) {
    
			case "show":
				stack1.showStack();
				break;
			case "push":
				System.out.println("请输入要压入栈的数据:");
				int value = scanner.nextInt();
				stack1.push(value);
				break;
			case "pop":
				try {
    
					int res = stack1.pop();
					System.out.printf("出栈的数据是:%d\n", res);
				} catch (Exception e) {
    
					// TODO: handle exception
					System.out.println(e.getMessage());
				}
				break;
			case "exit":
				scanner.close();
				loop = false;
				break;
			}
		}
		System.out.println("程序已退出!!!");
	}
}
原网站

版权声明
本文为[羽化登仙°]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_44290628/article/details/106958299