研磨数据结构与算法-03栈与队列

一,栈

public class MyStack {

//底层实现是一个数组

private long[] arr;

private int top;

/**

* 默认的构造方法

*/

public MyStack() {

arr = new long[10];

top = -1;

}

/**

* 带参数构造方法,参数为数组初始化大小

*/

public MyStack(int maxsize) {

arr = new long[maxsize];

top = -1;

}

/**

* 添加数据

*/

public void push(int value) {

arr[++top] = value;

}

/**

* 移除数据

*/

public long pop() {

return arr[top--];

}

/**

* 查看数据

*/

public long peek() {

return arr[top];

}

/**

* 判断是否为空

*/

public boolean isEmpty() {

return top == -1;

}

/**

* 判断是否满了

*/

public boolean isFull() {

return top == arr.length - 1;

}

}

测试:

public class TestMyStack {

public static void main(String[] args) {

MyStack ms = new MyStack(4);

ms.push(23);

ms.push(12);

ms.push(1);

ms.push(90);

System.out.println(ms.isEmpty());

System.out.println(ms.isFull());

System.out.println(ms.peek());

System.out.println(ms.peek());

while(!ms.isEmpty()) {

System.out.print(ms.pop() + ",");

}

System.out.println(ms.isEmpty());

System.out.println(ms.isFull());

}

}

二,队列

public class MyQueue {

//底层使用数组

private long[] arr;

//有效数据的大小

private int elements;

//队头

private int front;

//队尾

private int end;

/**

* 默认构造方法

*/

public MyQueue() {

arr = new long[10];

elements = 0;

front = 0;

end = -1;

}

/**

* 带参数的构造方法,参数为数组的大小

*/

public MyQueue(int maxsize) {

arr = new long[maxsize];

elements = 0;

front = 0;

end = -1;

}

/**

* 添加数据,从队尾插入

*/

public void insert(long value) {

arr[++end] = value;

elements++;

}

/**

* 删除数据,从队头删除

*/

public long remove() {

elements--;

return arr[front++];

}

/**

* 查看数据,从队头查看

*/

public long peek() {

return arr[front];

}

/**

* 判断是否为空

*/

public boolean isEmpty() {

return elements == 0;

}

/**

* 判断是否满了

*/

public boolean isFull() {

return elements == arr.length;

}

}

三,循环队列

public class MyCycleQueue {

//底层使用数组

private long[] arr;

//有效数据的大小

private int elements;

//队头

private int front;

//队尾

private int end;

/**

* 默认构造方法

*/

public MyCycleQueue() {

arr = new long[10];

elements = 0;

front = 0;

end = -1;

}

/**

* 带参数的构造方法,参数为数组的大小

*/

public MyCycleQueue(int maxsize) {

arr = new long[maxsize];

elements = 0;

front = 0;

end = -1;

}

/**

* 添加数据,从队尾插入

*/

public void insert(long value) {

if(end == arr.length - 1) {

end = -1;

}

arr[++end] = value;

elements++;

}

/**

* 删除数据,从队头删除

*/

public long remove() {

long value = arr[front++];

if(front == arr.length) {

front = 0;

}

elements--;

return value;

}

/**

* 查看数据,从队头查看

*/

public long peek() {

return arr[front];

}

/**

* 判断是否为空

*/

public boolean isEmpty() {

return elements == 0;

}

/**

* 判断是否满了

*/

public boolean isFull() {

return elements == arr.length;

}

}

测试:

public class TestMyQueue {

public static void main(String[] args) {

MyCycleQueue mq = new MyCycleQueue(4);

//MyQueue mq = new MyQueue(4);

mq.insert(23);

mq.insert(45);

mq.insert(13);

mq.insert(1);

System.out.println(mq.isFull());

System.out.println(mq.isEmpty());

System.out.println(mq.peek());

System.out.println(mq.peek());

while (!mq.isEmpty()) {

System.out.print(mq.remove() + " ");

}

System.out.println();

mq.insert(23);

mq.insert(45);

mq.insert(13);

mq.insert(1);

while (!mq.isEmpty()) {

System.out.print(mq.remove() + " ");

}

}

}

时间: 2024-11-04 14:51:14

研磨数据结构与算法-03栈与队列的相关文章

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

用JS描述的数据结构及算法表示——栈和队列(基础版)

前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里隐隐歌颂大神的厉害,然后别人的厉害不是我的,所以到底看得各种受打击+头昏脑涨,写这个系列是希望自己能够总结学到东一块.西一下的知识,因为水平有限+经验不足,所以在此只说最基础的思想,附上我自己的算法实现(肯定还有更优解),如果要想看进阶版的,可以在园里搜“数据结构”,各种语言实现和进阶提升的文章有很

数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈

今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列.可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归.那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题. 一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出. public class Queen(Stack s1,Stack s2){ //实现插入的方法 public void ad

数据结构和算法之栈和队列二:栈的压入,弹出序列

当时我在学习这个的时候也是非常不理解这个问题,一个栈的压入和弹出序列的判断一看不就知道了么,还去判断干嘛.只要符合后进先出的规则就行.但是我在这里简单说一下这个压入和弹出序列是怎么回事.就是我们给定假设的两个序列,一个为压入序列,一个为弹出序列.然后我们再通过一个辅助的栈,把压入序列的数据一个一个push()进入临时的辅助栈中,如果栈顶元素刚好和弹出序列的数据一样,那么我们就弹出,如果不一样我们就将压入序列的数据继续压入临时栈中,直到到达序列结束.如果压入序列结束,临时栈全部数据弹出那么就是一个

数据结构算法(1)--栈与队列

数据结构算法(1)--栈与队列 总结并记录学习数据结构过程中遇到的问题及算法. 一些常见算法: Note: 基础应用. 递归的非递归转化. 阶乘 递归实现: #include <iostream> using namespace std; int F(int n) { if (n == 0 || n == 1) return 1; else return n * F(n - 1); } int main() { int s; cin >> s; int result = F(s);

《数据结构与算法》-3-栈和队列

目录 1. 栈 1.1 栈的基本概念 1.2 栈的顺序存储结构 1.3 栈的链式存储结构 2. 队列 2.1 队列的基本概念 2.2 队列的顺序存储结构 2.3 队列的链式存储结构 2.4 双端队列 3. 栈和队列的应用 3.1 栈在括号匹配中的应用 3.2 栈在表达式求值中的应用 3.3 栈对递归中的应用 3.4 队列在层次遍历中的应用 3.5 队列在计算机系统中的应用 4. 特殊矩阵的压缩存储 4.1 数组的定义 4.2 数组的存储结构 4.3 矩阵的压缩存储 ? 该系列博客的目的是为了学习

java数据结构与算法之栈(Stack)设计与实现

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53362993 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈设计与实现 ??本篇是jav

数据结构实验三《栈和队列》

<数据结构>实验三 栈和队列 一.实验目的 巩固栈和队列数据结构,学会运用栈和队列. 1.回顾栈和队列的逻辑结构和受限操作特点,栈和队列的物理存储结构和常见操作. 2.学习运用栈和队列的知识来解决实际问题. 3.进一步巩固程序调试方法. 4.进一步巩固模板程序设计. 二.实验时间 准备时间为第5周到第6周,具体集中实验时间为6周第2次课.2个学时. 三.实验内容 1.自己选择顺序或链式存储结构,定义一个空栈类,并定义入栈.出栈.取栈元素基本操作.然后在主程序中对给定的N个数据进行验证,输出各个

数据结构与算法(3)-----&gt;队列和栈

1. 栈和队列的基本性质 栈是先进后出;(像是子弹夹,后进先打出) 队列是先进先出;(像是平时排队买冰淇淋,按顺序轮流) 栈和队列在实现的结构上可以有数组和链表两种形式; (1)数组结构实现容易; (2)用链表结构较为复杂,因为牵扯很多的指针操作; 1.1  栈结构的基本操作 (1)pop操作;(弹出) (2)top或peek操作; (3)push操作;(压栈) (4)size操作; 1.2  队列的基本操作 (1)队列的基本操作与栈操作不同的是,push操作作为在队头加入元素;而pop操作是从