首页 > 其他分享 >数据结构之栈与队列

数据结构之栈与队列

时间:2023-06-08 20:05:02浏览次数:35  
标签:之栈 队列 Object int elements front 元素 数据结构 public


      栈和队列是两种重要的数据结构。从栈与队列的逻辑结构上来说,它们也是线性结构,
与线性表不同的是它们所支持的基本操作是受到限制的,它们是操作受限的线性表,是一种
限定性的数据结构。
     栈(stack)又称堆栈,它是运算受限的线性表,其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行插入、查找、删除等操作。表中进行插入、删除操作的一端称为栈顶(top),栈顶保存的元素称为栈顶元素。相对的,表的另一端称为栈底(bottom)。
    当栈中没有数据元素时称为空栈;向一个栈插入元素又称为进栈或入栈;从一个栈中删除元素又称为出栈或退栈。由于栈的插入和删除操作仅在栈顶进行,后进栈的元素必定先出栈,所以又把堆栈称为后进先出表(Last In First Out,简称LIFO)。

数据结构之栈与队列_ci


 public interface Stack {
	//返回堆栈的大小
	public int getSize();
	//判断堆栈是否为空
	public boolean isEmpty();
	//数据元素e 入栈
	public void push(Object e);
	//栈顶元素出栈
	public Object pop() throws StackEmptyException;
	//取栈顶元素
	public Object peek() throws StackEmptyException;
}
public class StackEmptyException extends RuntimeException{
	public StackEmptyException(String err) {
		super(err);
	}
}       Stack 的顺序存储实现:public class StackArray implements Stack {
	private final int LEN = 8; //数组的默认大小
	private Object[] elements; //数据元素数组
	private int top; //栈顶指针
	public StackArray() {
		top = -1;
		elements = new Object[LEN];
	}
	//返回堆栈的大小
	public int getSize() {
		return top + 1;
	}
	//判断堆栈是否为空
	public boolean isEmpty() {
		return top < 0;
	}
	//数据元素e 入栈
	public void push(Object e) {
		if (getSize() >= elements.length) 
			expandSpace();
		elements[++top] = e;
	}
	private void expandSpace(){
		Object[] a = new Object[elements.length * 2];
		for (int i = 0; i < elements.length; i++)
			a[i] = elements[i];
		elements = a;
	}
	//栈顶元素出栈
	public Object pop() throws StackEmptyException {
		if (getSize() < 1)
			throw new StackEmptyException("错误,堆栈为空。");
		Object obj = elements[top];
		elements[top--] = null;
		return obj;
	}
	//取栈顶元素
	public Object peek() throws StackEmptyException {
		if (getSize() < 1)
			throw new StackEmptyException("错误,堆栈为空。");
		return elements[top];
	}
}     Stack 的链式存储实现:public class StackSLinked implements Stack {
	private SLNode top; //链表首结点引用
	private int size; //栈的大小
	public StackSLinked() {
		top = null;
		size = 0;
	}
	//返回堆栈的大小
	public int getSize() {
		return size;
	}
	//判断堆栈是否为空
	public boolean isEmpty() {
		return size == 0;
	}
	//数据元素e 入栈
	public void push(Object e) {
		SLNode q = new SLNode(e, top);
		top = q;
		size++;
	}
	//栈顶元素出栈
	public Object pop() throws StackEmptyException {
		if (size < 1)
			throw new StackEmptyException("错误,堆栈为空。");
		Object obj = top.getData();
		top = top.getNext();
		size--;
		return obj;
	}
	//取栈顶元素
	public Object peek() throws StackEmptyException {
		if (size < 1)
			throw new StackEmptyException("错误,堆栈为空。");
		return top.getData();
	}
}      队列:它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。在队列中把插入数据元素的一端称为队尾(rear),删除数据元素的一端称为队首(front)。向队尾插入元素称为进队或入队,新元素入队后成为新的队尾元素;从队列中删除元素称为离队或出队,元素出队后,其后续元素成为新的队首元素。
    由于队列的插入和删除操作分别在队尾和队首进行,每个元素必然按照进入的次序离队,也就是说先进队的元素必然先离队,所以称队列为先进先出表(First In First Out,简称FIFO)。 public interface Queue {
	//返回队列的大小
	public int getSize();
	//判断队列是否为空
	public boolean isEmpty();
	//数据元素e 入队
	public void enqueue(Object e);
	//队首元素出队
	public Object dequeue() throws QueueEmptyException;
	//取队首元素
	public Object peek() throws QueueEmptyException;
}
public class QueueEmptyException extends RuntimeException {
	public QueueEmptyException(String err) {
		super(err);
	}
}


数据结构之栈与队列_ci_02


  

Queue 的顺序存储实现:public class QueueArray implements Queue {
	private static final int CAP = 7;//队列默认大小
	private Object[] elements; //数据元素数组
	private int capacity; //数组的大小elements.length
	private int front; //队首指针,指向队首
	private int rear; //队尾指针,指向队尾后一个位置
	public QueueArray() {
		this(CAP);
	}
	public QueueArray(int cap){
		capacity = cap + 1;
		elements = new Object[capacity];
		front = rear = 0;
	}
	//返回队列的大小
	public int getSize() {
		return (rear - front + capacity) % capacity;
	}
	//判断队列是否为空
	public boolean isEmpty() {
		return front == rear;
	}
	//数据元素e 入队
	public void enqueue(Object e) {
		if (getSize() == capacity - 1)
			expandSpace();
		elements[rear] = e;
		rear = (rear + 1) % capacity;
	}
	private void expandSpace(){
		Object[] a = new Object[elements.length * 2];
		int i = front;
		int j = 0;
		//将从front 开始到rear 前一个存储单元的元素复制到新数组
		while (i != rear){ 
			a[j++] = elements[i];
			i = (i + 1) % capacity;
		}
		elements = a;
		capacity = elements.length;
		front = 0;
		rear = j; //设置新的队首、队尾指针
	}
	//队首元素出队
	public Object dequeue() throws QueueEmptyException {
		if (isEmpty())
			throw new QueueEmptyException("错误:队列为空");
		Object obj = elements[front];
		elements[front] = null;
		front = (front + 1) % capacity;
		return obj;
	}
	//取队首元素
	public Object peek() throws QueueEmptyException {
		if (isEmpty())
			throw new QueueEmptyException("错误:队列为空");
		return elements[front];
	}
}
Queue 的链式存储实现:public class QueueSLinked implements Queue {
	private SLNode front;
	private SLNode rear;
	private int size;
	public QueueSLinked() {
		front = new SLNode();
		rear = front;
		size = 0;
	}
	//返回队列的大小
	public int getSize() {
		return size;
	}
	//判断队列是否为空
	public boolean isEmpty() {
		return size == 0;
	}
	//数据元素e 入队
	public void enqueue(Object e) {
		SLNode p = new SLNode(e, null);
		rear.setNext(p);
		rear = p;
		size++;
	}
	//队首元素出队
	public Object dequeue() throws QueueEmptyException {
		if (size < 1)
			throw new QueueEmptyException("错误:队列为空");
		SLNode p = front.getNext();
		front.setNext(p.getNext());
		size--;
		if (size < 1) 
			rear = front; //如果队列为空,rear 指向头结点
		return p.getData();
	}
	//取队首元素
	public Object peek() throws QueueEmptyException {
		if (size < 1)
			throw new QueueEmptyException("错误:队列为空");
		return front.getNext().getData();
	}
}    

标签:之栈,队列,Object,int,elements,front,元素,数据结构,public
From: https://blog.51cto.com/u_16131764/6442687

相关文章

  • 几种常见的 Python 数据结构
     摘要:本文主要为大家讲解在Python开发中常见的几种数据结构。数据结构和序列元组元组是一个固定长度,不可改变的Python序列对象。创建元组的最简单方式,是用逗号分隔一列值:In[1]:tup=4,5,6当用复杂的表达式定义元组,最好将值放到圆括号内,如下所示:In[3]:nested_tup=(4,......
  • Java语言实现生产者与消费者的消息队列模型(附源码)
    Java构建生产者与消费者之间的生产关系模型,可以理解生产者生产message,存放缓存的容器,同时消费者进行消费需求的消耗,如果做一个合理的比喻的话:生产者消费者问题是线程模型中的经典问题。解决生产者/消费者问题有两种方法:一是采用某种机制保护生产者和消费者之间的同步;二是在生产者和......
  • 消息队列
    消息队列解耦、异步、削峰应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉......
  • Redis系列15:使用Stream实现消息队列(精讲)
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集群模式追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级......
  • 栈&队列:剑指 Offer 09. 用两个栈实现队列
    题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回-1)   classCQueue{LinkedList<Integer>A,B;publicCQu......
  • MySQL索引的数据结构
    一:索引概述MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。索引的本质:索引是数据结构。可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法。1:索引优缺点......
  • JS 模拟 队列 结构
    Code:/***队列(基于动态数组)*@class*/varAQueue=(function(){/***栈容器*@type{DArray}*/letarr;/***@class*/class_AQueue{/***构造器*@constructor*@param{number}[capacity]*/con......
  • 初级数据结构--栈在表达式求职中的应用2
    只支持正确格式表达式,判断非法表达式逻辑没写太多纯个人理解,指套入了部分表达式测试,如有错误欢迎指出#include<stdio.h>#include<stdlib.h>#include<stdbool.h>#include<ctype.h>typedefstructOperand{ intand[MAX_SIZE]; inttop;}Operand;typedefstructOperato......
  • 【python】一个同步的队列类queue
    queuequeue 模块实现了多生产者、多消费者队列。这特别适用于消息必须安全地在多线程间交换的线程编程。模块中的 Queue 类实现了所有所需的锁定语义。 函数作用Queue.qsize()返回队列的大致大小。注意,qsize()>0不保证后续的get()不被阻塞,qsize()<maxsize......
  • 数据结构与算法-06树及二叉树
    树和二叉树完全二叉树:除了最下层,每一层都满了满二叉树:每一层都满了平衡二叉树:任意两个节点的高度差不大于1排序二叉树:链式存储常见应用场景xml/html解析路由协议mysql数据库索引文件系统结构二叉树在二叉树的第i层上至多有2^(i-1)个结点深度为k的二叉树......