栈的数组和链表实现(Java实现)
我以前用JavaScript写过栈和队列,这里初学Java,于是想来实现栈,基于数组和链表。
下面上代码:
import java.io.*;
//用接口来存放需要的所有操作
interface stack<T>{
boolean isEmpty(); //判空
void clear(); //清空
T pop(); //弹栈
boolean push(T data); //入栈
int length(); //返回长度
T peek(); //查看栈顶值
int search(T t); //查找元素位置
void display(); //输出所有的元素
} //用数组实现栈
class ArrayStack<T> implements stack<T>{
public ArrayStack(){}
private T[] array = (T[])new Object[16];
private int size = 0; public int length(){
for(int i=0;i<array.length;i++){
if(array[i] != null) size++;
}
return size;
} public boolean isEmpty(){
return (size == 0);
} public void clear(){
for(int i=0;i<array.length;i++){
array[i] = null;
}
size = 0;
} public T pop(){
if(size == 0) return null;
else{
T temp = array[size-1];
array[size-1] = null;
size--;
return temp;
}
} public boolean push(T data){
if(size >= array.length) {
resize(); //重新分配一个两倍大小的数组
array[size++] = data;
}
else{
array[size++] = data;
}
return true;
} public void resize(){
T[] temp = (T[])new Object[array.length*2];
for(int i=0;i<array.length;i++){
temp[i] = array[i];
}
for(int i=array.length;i<array.length*2;i++){
temp[i] = null;
}
array = temp;
temp = null;
} public T peek(){
if(size == 0) return null;
else return array[size-1];
} public int search(T t){
for(int i=0;i<size;i++){
if(array[i] == t) return i+1;
}
return 0;
} public void display(){
for(int i=0;i<size;i++){
System.out.println("data: " + array[i]);
}
} } //用链表实现栈 class LinkStack<T> implements stack<T>{
public LinkStack(){
this.top = null;
this.size = 0;
}
//存放数据的结点
class Node{
private T data;
private Node pre;
}
private Node top; //栈顶指针
private int size; //栈的大小 public boolean isEmpty(){
if(size == 0) return true;
else return false;
} public void clear(){
top = null;
size = 0;
} public T pop(){
if(top != null){
T temp = top.data;
top = top.pre;
size--;
return temp;
}
return null;
} public boolean push(T data){
Node node = new Node();
node.data = data;
node.pre = null;
if(top == null){
top = node;
node = null;
size++;
return true;
}
else{
node.pre = top;
top = node;
node = null;
size++;
return true;
}
} public int length(){
return size;
} public T peek(){
return top.data;
} public int search(T t){
int num = size;
while(top.pre != null)
{
if(top.data == t)
return (num-1);
else
{
top = top.pre;
num--;
}
}
return 0;
} public void display(){
Node node = top;
while(top != null)
{
System.out.println("data: " + top.data);
top = top.pre;
}
top = node;
node = null;
} } public class test{
public static void main(String[] args){
ArrayStack<String> a = new ArrayStack();
a.push("hello,world...");
a.push("my name is: ");
a.push("jeavenwong");
a.display(); LinkStack<String> b = new LinkStack();
b.push("how are you?");
b.push("i am fine...");
b.push("and you?...");
b.display();
}
}
下面是我的运行结果:

如有不对,欢迎批评指正。
栈的数组和链表实现(Java实现)的更多相关文章
- 二叉树、栈、队列、链表的Java代码实现
这是我的学习总结. 如有文章存在谬误,欢迎指出,有其他意见或者建议,也欢迎留言 二叉树链表 前序遍历:先访问根节点,然后访问左子树.右子树 中序遍历:先访问左子树,然后访问根节点.右子树 后序遍历:先 ...
- 栈的Java实现-分别使用数组和链表
栈是非常重要的数据结构,栈具有后进先出的特点. 在JVM内部,每个线程维护一个栈,对于每个方法调用,入栈一个元素,成为栈帧,当方法执行完成后,对应的栈帧出栈. 栈帧中,也包含一个栈,称为操作数栈. 一 ...
- 牛客网Java刷题知识点之数组、链表、哈希表、 红黑二叉树
不多说,直接上干货! 首先来说一个非常形象的例子,来说明下数组和链表. 上体育课的时候,老师说:你们站一队,每个人记住自己是第几个,我喊到几,那个人就举手,这就是数组. 老师说,你们每个人记住自己前面 ...
- Collection集合重难点梳理,增强for注意事项和三种遍历的应用场景,栈和队列特点,数组和链表特点,ArrayList源码解析, LinkedList-源码解析
重难点梳理 使用到的新单词: 1.collection[kəˈlekʃn] 聚集 2.empty[ˈempti] 空的 3.clear[klɪə(r)] 清除 4.iterator 迭代器 学习目标: ...
- 数组和链表--Java学习笔记(一)
版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 我是一个全职妈妈,两年前在上海一家人力资源 ...
- 源码:Java集合源码之:数组与链表(一)
数组和链表是数据结构中最基本的部分. 数组 在java中,数组定义为一种基本类型,其可以通过下标获取到对应位置的数据.那么这种结构的数据,在内存中是怎么存放的呢? 数组在内存中是一段连续的存储单元,每 ...
- JAVA 基本数据结构--数组、链表、ArrayList、Linkedlist、hashmap、hashtab等
概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
- 数组、链表、栈、队列和STL
数组 数组是一种最基本的数据结构,它是内存上的一块连续存储空间.正因如此数组的随机访问很方便.但数组也有其固有的限制,大小分配后不能改变. STL中的数组 STL中的Array是静态数组模板,就是我们 ...
随机推荐
- 服务器爆满:cannot create temp file for here-document: No space left on device
1 概述 服务器的磁盘空间被占满导致TAB补全指令失效(TAB会创建临时文件) cannot create temp file for here-document: No space left on ...
- 微信公众号支付备忘及填坑之路-java
一.背景 最近公司给第三方开发了一个公众号,其中最重要的功能是支付,由于是第一次开发,遇到的坑特别的多,截止我写博客时,支付已经完成,在这里我把遇到的坑记录一下(不涉及退款).不得不吐槽一下,腾讯这么 ...
- Google开源项目风格指南
Google开源项目风格指南 来源 https://github.com/zh-google-styleguide/zh-google-styleguide Google 开源项目风格指南 (中文版) ...
- synchronized 底层实现原理
线程在获取锁的时候,其指针指向的是一个monitor对象(由C++实现)的起始地址.每个对象实例都会有一个 monitor.其中monitor可以与对象一起创建.销毁:亦或者当线程试图获取对象锁时自动 ...
- hexo发布后样式丢失
修改配置中url路径,和root,问题解决.
- javaScript节流与防抖
一.节流(throttle) 用来实现阻止在短时间内重复多次触发同一个函数.主要用途:防止使用脚本循环触发网络请求的函数的恶意行为,确保请求的真实性(当然也包括其他阻止高频触发行为的应用): 实现原理 ...
- HTTP中GET,POST和PUT的区别
一.HTTP中定义了以下几种请求方法: 1.GET:2.POST:3.PUT:4.DELETE;5.HEAD:6.TRACE:7.OPTIONS: 二.各个方法介绍: 1.GET方法:对这个资源的查操 ...
- bash shell脚本之获取时间日期
shell中的时间日期获取 cat test5: #!/bin/bash # using the backtick character testing=`date` echo "The da ...
- 【loj#2524】【bzoj5303】 [Haoi2018]反色游戏(圆方树)
题目传送门:loj bzoj 题意中的游戏方案可以转化为一个异或方程组的解,将边作为变量,点作为方程,因此若方程有解,方程的解的方案数就是2的自由元个数次方.我们观察一下方程,就可以发现自由元数量=边 ...
- Jupyter安装和环境配置
配置: 1. 命令行启动 jupyter notebook 2. 也可以Anaconda直接启动 3. 设置token,如下图所示,命令行中输入 jupyter notebook list C:\Us ...