我以前用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实现)的更多相关文章

  1. 二叉树、栈、队列、链表的Java代码实现

    这是我的学习总结. 如有文章存在谬误,欢迎指出,有其他意见或者建议,也欢迎留言 二叉树链表 前序遍历:先访问根节点,然后访问左子树.右子树 中序遍历:先访问左子树,然后访问根节点.右子树 后序遍历:先 ...

  2. 栈的Java实现-分别使用数组和链表

    栈是非常重要的数据结构,栈具有后进先出的特点. 在JVM内部,每个线程维护一个栈,对于每个方法调用,入栈一个元素,成为栈帧,当方法执行完成后,对应的栈帧出栈. 栈帧中,也包含一个栈,称为操作数栈. 一 ...

  3. 牛客网Java刷题知识点之数组、链表、哈希表、 红黑二叉树

    不多说,直接上干货! 首先来说一个非常形象的例子,来说明下数组和链表. 上体育课的时候,老师说:你们站一队,每个人记住自己是第几个,我喊到几,那个人就举手,这就是数组. 老师说,你们每个人记住自己前面 ...

  4. Collection集合重难点梳理,增强for注意事项和三种遍历的应用场景,栈和队列特点,数组和链表特点,ArrayList源码解析, LinkedList-源码解析

    重难点梳理 使用到的新单词: 1.collection[kəˈlekʃn] 聚集 2.empty[ˈempti] 空的 3.clear[klɪə(r)] 清除 4.iterator 迭代器 学习目标: ...

  5. 数组和链表--Java学习笔记(一)

    版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 我是一个全职妈妈,两年前在上海一家人力资源 ...

  6. 源码:Java集合源码之:数组与链表(一)

    数组和链表是数据结构中最基本的部分. 数组 在java中,数组定义为一种基本类型,其可以通过下标获取到对应位置的数据.那么这种结构的数据,在内存中是怎么存放的呢? 数组在内存中是一段连续的存储单元,每 ...

  7. JAVA 基本数据结构--数组、链表、ArrayList、Linkedlist、hashmap、hashtab等

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  8. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  9. 数组、链表、栈、队列和STL

    数组 数组是一种最基本的数据结构,它是内存上的一块连续存储空间.正因如此数组的随机访问很方便.但数组也有其固有的限制,大小分配后不能改变. STL中的数组 STL中的Array是静态数组模板,就是我们 ...

随机推荐

  1. 怎样启动和关闭nginx服务器

    启动: 直接使用命令: nginx nginx 关闭1: 快速停止 nginx -s stop 关闭2: 完整有序停止 nginx -s quit 重启: 如下 nginx -s reload

  2. vue开发中利用正则限制input框的输入(手机号、非0开头的正整数等)

    我们在前端开发中经常会碰到类似手机号输入获取验证码的情况,通常情况下手机号的输入需要只能输入11位的整数数字.并且需要过滤掉一些明显不符合手机号格式的输入,那么我们就需要用户在输入的时候就控制可以输入 ...

  3. LINQ 多条件join on

    var  tmp = from a in DT1.AsEnumerable() join b in DT2.AsEnumerable() on new { bm = a.Field<string ...

  4. eventFlow 系列 <二> 领域事件

    看一个聚合根: public class ExampleAggregate : AggregateRoot<ExampleAggregate, ExampleId>, IEmit<E ...

  5. 题解 P3369 【【模板】普通平衡树(Treap/SBT)】

    STL真是个好东西. 最近在看pb_ds库及vector和set的用法,就想用这三种操作来实现一下普通平衡树,结果pb_ds中的rbtree不支持重复值,而本蒟蒻也看不懂不懂各大佬用pb_ds的实现, ...

  6. 无法删除登录名 '***',因为该用户当前正处于登录状态。 (Microsoft SQL Server,错误: 15434)

    问题描述: 当删除数据库用户时,有时会得到这样的提示: 无法删除登录名 '***',因为该用户当前正处于登录状态. (Microsoft SQL Server,错误: 15434) 解决办法: 1.首 ...

  7. django form 和modelform样式设置

      目录 1.form通过attr设置属性 2.输入框设置表单状态 3.modelform的使用 4.结合modelform 使用for循环生成输入框 5.基于init构造方法设置样式 6.基本增删改 ...

  8. 手写走通HTTP server 第三版本

    后台 后端 服务端 功能:逻辑处理 算法处理    磁盘交互(数据库   静态文件处理) 要求:健壮性,安全性 并发性能和处理速度 架构合理便于维护扩展 网站后端 httpserver + WebFr ...

  9. Spark的Shuffle

    0. Shuffle概述 要理解什么是Shuffle,首先介绍大数据与分布式.我们知道大数据的存储是分布式存储,大数据的计算框架是分布式的计算框架.分布式必然存在数据的交互传输,简言之Shuffle就 ...

  10. GOLANG多态的特征是通过接口来实现的 GOLANG多态形式之一:多态参数

    GOLANG多态的简单实现 //多态的特征是通过接口来实现的 //多态形式之一:多态参数 package main import( "fmt" _"sort" ...