栈与队列基本操作 Java实现
一、顺序栈
//数组实现顺序栈
public class OrderStack {
private String[] elem;
private int top;
OrderStack(int k) {
elem = new String[k];
top = -1;
}
//判满
boolean isFull() {
return top == (elem.length - 1);
}
//判空
boolean isEmpty() {
return top == -1;
}
//进栈
boolean push(String s) {
if(isFull()) {
return false;
}
elem[++top] = s;
return true;
}
//出栈
String pop() {
if(isEmpty()) {
System.out.println("Empty stack");
return null;
}else {
return elem[top--];
}
}
//获取栈顶元素
String getTop() {
if(isEmpty()) {
System.out.println("Empty stack");
return null;
}else {
return elem[top];
}
} }
二、链栈
存储结构
public class LinkNode {
int i;
LinkNode next;
LinkNode(int i) {
this.i = i;
}
public String toString() {
return String.valueOf(i);
}
}
链栈实现
//链表存储实现
public class LinkStack {
private LinkNode top;
LinkStack() {
top = new LinkNode(-1);
}
boolean isEmpty() {
return top.next ==null;
}
//头插法方便出栈
LinkNode push(LinkNode temp) {
if(temp == null) {
System.out.println("null pointer");
}
temp.next = top.next;
top.next = temp;
return temp;
}
LinkNode pop() {
LinkNode temp = null;
if(isEmpty()) {
System.out.println("empty");
return null;
}
temp = top.next;
top.next = temp.next;
return temp;
}
LinkNode getTop() {
return top.next;
}
}
三、队列
存储结构
public class LinkNode {
int i;
LinkNode next;
LinkNode(int i) {
this.i = i;
}
public String toString() {
return String.valueOf(i);
}
}
链队列
public class MyQueue {
private LinkNode front;
private LinkNode rear;
MyQueue() {
front = new LinkNode(-1);
rear = front;
}
boolean isEmpty() {
return front == rear;
}
LinkNode enterQueue(LinkNode temp) {
rear.next = temp;
rear = temp;
return temp;
}
LinkNode deleteQueue() {
if(isEmpty()) {
System.out.println("Empty");
}
LinkNode temp = front.next;
if(front.next == rear) {
front.next = rear.next;
rear = front;
}
front.next = temp.next;
temp.next = null;
return temp;
}
}
循环队列
//数组实现的循环队列
//采用不损失空间的方式实现
public class CirQueue {
private String[] elem;
private int front;
private int rear;
//入队flag赋1值,出队flag赋0值
private int flag = 0;
CirQueue(int k) {
elem = new String[k];
front = 0;
rear = 0;
}
boolean isFull() {
return flag == 1 && rear == front;
}
boolean isEmpty() {
return flag == 0 && rear == front;
}
String enter(String temp) {
if(isFull()) {
System.out.println("Full");
}else {
elem[rear] = temp;
rear = (rear + 1) % elem.length;
flag = 1;
}
return temp;
}
String delete() {
String temp = null;
if(isEmpty()) {
System.out.println("Empty");
}else {
temp = elem[front];
front = (front + 1)%elem.length;
flag = 0;
}
return temp;
}
}
这里使用了一个编程的小技巧,将操作打上了记号。
栈与队列基本操作 Java实现的更多相关文章
- 数据结构之栈和队列及其Java实现
栈和队列是数据结构中非常常见和基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用栈和队列相互实现. 栈:栈是一种基于“后进先出”策略的线性表.在 ...
- Go实现栈与队列基本操作
@ 目录 一 前言 二 实现栈与队列基本操作 2.1 栈基本操作 2.2 队列基本操作 三 用栈实现队列 3.1 理论 3.2 算法题 3.3 思路 3.4 代码部分 四 用队列实现栈 4.1 理论 ...
- 数据结构 1 线性表详解 链表、 栈 、 队列 结合JAVA 详解
前言 其实在学习数据结构之前,我也是从来都没了解过这门课,但是随着工作的慢慢深入,之前学习的东西实在是不够用,并且太皮毛了.太浅,只是懂得一些浅层的,我知道这个东西怎么用,但是要优化.或者是解析,就不 ...
- 算法_栈与队列的Java链表实现
链表是一个递归的数据结构,它或者为null,或者是指向一个结点的引用,该结点含有一个泛型的元素和指向另一个链表的引用.可以用一个内部类来定义节点的抽象数据类型: private class Node ...
- 剑指Offer-5.用两个栈实现队列(C++/Java)
题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析: 栈的特点是先进后出,队列的特点则是先进先出. 题目要求我们用两个栈来实现一个队列,栈和队列都有入栈 ...
- 两个队列实现栈&两个栈实现队列(JAVA)
1,两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路:栈的特点时先进后出,队列的特点是先进先出. 若此时有两个队列stack1,st ...
- 剑指offer第二版面试题8:用两个栈实现队列(JAVA版)
题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能. 分析: 我们通过一个具体的例子来分析 ...
- 剑指offer 计划1(栈与队列)---java
1.1.题目1 剑指 Offer 09. 用两个栈实现队列 1.2.解法 解法如题目所说.定义两个栈.这里假设第一个栈为a,第二个栈为b. 实现两个函数增加尾和删除头. 增加即直接push入第一个栈. ...
- 栈和队列的Java实现
一. 栈 1.概念 栈是一种特殊的线性表,它只能在栈顶(top)进行插入(push)和删除(pop)操作. 栈的常用操作: 入栈(push):向栈顶插入元素 出栈(pop):从栈顶删除元素 访问栈顶 ...
随机推荐
- [Luogu] 天天爱跑步
https://www.luogu.org/problemnew/show/P1600 https://www.zybuluo.com/wsndy-xx/note/1135243 乱写的暴力,这道题暴 ...
- c++继承子类构造函数问题
c++中子类在继承基类的时候需要在构造函数中初始化变量.如果基类没有构造函数或者只有不带参数的构造函数,那么子类中的构造函数就不需要调用基类的构造函数了. 个人总结了两点子类中构造函数必须调用父类的构 ...
- SpringSecurity学习总结
第一.SpringSecurity-简介 1.1简介 SpringSecurity融合Spring技术栈,提供JavaEE应 用的整体安全解决方案: Spring Security为基于Java EE ...
- C#操作 Access 2013(.accdb)的方法
使用的Microsoft.Jet.OLEDB.4.0,的方法并不能连接最新的Access 存储文件,而且Microsoft.Jet.OLEDB.4.0不能使用x64的方式生成,而且使用这个数据库引擎效 ...
- TCO14 Wildcard CountTables——斯特林反演
不知道咕了多长时间的题... 讲了3遍,还是自己搞懂了.. 暂时没有找到题目链接 题意: n×m的网格,每个格子填[1,x]的数,使得不存在两行两列同构. 先保证一个,行相同. 再容斥掉列. 枚举至多 ...
- dcokee 安装 nginx
1,docker pull openresty/openresty 2, mkdir /opt/local/openresty 等等文件夹 3, docker run --name=" ...
- Docker+Rancher构建部署流水线
工作多年,在项目部署方面, 1:以前用ftp或者rz上传更新的,每次更新算上打包.目录切换.更新遗漏.备份.出错还原.启动等工作都得搞上一来小时甚至更长,要是多两台服务器那心都凉了: 2:后来有用sv ...
- TCP拥塞控制算法
转自浅谈TCP拥塞控制算法 本篇文章介绍了几种经典的TCP拥塞控制算法,包括算法原理及各自适用场景. 回顾上篇文章:浅谈 redis 延迟 前言 TCP 通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的 ...
- 通过Maven更换环境配置文件
大致思路:配置文件有三套:main/resources.devmain/resources.prodmain/resources.test公共部分放到main/resource下使用mvn clean ...
- Android8.0新特性总结
1.通知渠道:开发者可以自定义应用的通知内容类别,为用户提供一个可以对通知精细控制的接口,用户可以对通知 进行精细的掌控 开发指南 创建通知渠道的步骤: 创建 NotificationChann ...