Java数据结构(一):栈

版权声明:转载请注明原文地址。 https://blog.csdn.net/qq_39240270/article/details/86765941

什么是栈

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 --百度百科.

数据结构中的栈长这个样子:
在这里插入图片描述
栈其实非常的好理解,我们可以将栈看成一个箱子

  • 往箱子里放东西叫做入栈
  • 从箱子里取东西叫做出栈
  • 箱子的底部叫做栈底
  • 箱子的顶部叫做栈顶

栈的特性

关于栈的特性,有一句特别经典的言语来概括:先进先出(LIFO,Last In First Out)

  • 往箱子里放书,想要拿出箱子底部的书,得把箱子顶部的书先拿走才行。

栈的实现

下面是用数组实现栈(静态栈):

public class ArrayStack {
	private int size;//容量
	private long a[];
	private int top;//栈顶
	
	public ArrayStack(int maxSize) {
		this.size = maxSize; //定义栈的最大容量
		this.a = new long[maxSize];//初始化栈
		this.top = -1;//初始化栈顶,表示空栈
	}
	
	//入栈
	public void push(int value) {
		if(isFull()) {
			System.out.println("栈已满!");
			return;
		}
		a[++top] = value;
	}
	
	//查看栈顶元素,不删除
	public long peek() {
		if(isEmpty()) {
			System.out.println("栈为空!");
			return -1;
		}
		return a[top];
	}
	
	//弹出栈顶元素,删除,并返回栈顶元素
	public long pop() {
		if(isEmpty()) {
			System.out.println("栈为空!");
			return -1;
		}
		return a[top--];
	}
	
	//遍历栈,从栈顶开始遍历
	public void traverseStack() {
		for(int i = top;i >= 0;i--) {
			System.out.println(a[i]);
		}
	}
	
	//判断栈是否已满
	public boolean isFull() {
		return size == top + 1;
	}
	
	//判断栈是否为空
	public boolean isEmpty() {
		return top == -1;
	}
}

下面使用链表实现(动态栈),因为此时栈的大小可以改变:

//节点类
class Node {
	//为方便数据查看,用public声明
	//数据域
	public int data;
	//指向下一个节点
	public Node next;
	
	public Node(int data) {
		this.data = data;
	}
}
public class LinkedStack {
	//栈顶指针
	private Node stackTop;
	//栈顶指针
	private Node stackBottom;
	//栈的大小,方便测试,声明为public
	public int size;
	
	public LinkedStack() {}

	//初始化栈
	public LinkedStack(Node stackTop,Node stackBottom) {
		this.stackTop = stackTop;
		this.stackBottom = stackBottom;
		this.size = 0;
	}
	
	//入栈
	public void push(int data) {
		//创建节点
		Node node = new Node(data);
		
		//将栈顶本来指向的节点交给该新节点
		node.next = this.stackTop; 
		
		//将该节点设为栈顶
		this.stackTop = node;
		
		//栈的大小加一
		size ++;
	}
	
	//查看栈顶数值
	public int peek() {
		//判断栈是否为空
		if(isEmpty()) {
			System.out.println("栈为空!");
			return -1;
		}
		return this.stackTop.data;
	}
	
	//弹出栈顶元素,并删除,返回栈顶数值
	public int pop() {
		//判断栈是否为空
		if(isEmpty()) {
			System.out.println("栈为空!");
			return -1;
		}
		int i = this.stackTop.data; 
		this.stackTop = this.stackTop.next;
		size --;
		return i;
	}
	
	//遍历栈,从栈顶开始
	public void traverseStack() {
		//创建一个新节点用于遍历栈
		Node currentNode = stackTop;
		while( currentNode != null) {
			System.out.println(currentNode.data);
			currentNode = currentNode.next;
		}
	}
	
	//查看栈中值的数目
	public int size() {
		return size;
	}
	
	//清空栈
	public void clear() {
		//使栈顶元素指向栈底即可清空栈
		this.stackTop = this.stackBottom;
	}
		
	//判断栈是否为空
	public boolean isEmpty() {
		return size == 0;
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_39240270/article/details/86765941