我以前用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. beego 参数配置

    详细配置请参考:https://godoc.org/github.com/astaxie/beego#pkg-constants. App配置 AppName 应用名称,默认是 beego.通过bee ...

  2. jquery model 框设定

    https://www.bootcdn.cn/   国内网址引用 js function searchItemInfo(conditionNo,lotCD,itemKey) { var conditi ...

  3. IOS开发copy,nonatomic, retain,weak,strong用法

     readwrite 是可读可写特性;需要生成getter方法和setter方法时  readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变  ass ...

  4. 关于SpringBoot的自动配置和启动过程

    一.简介 Spring Boot简化了Spring应用的开发,采用约定大于配置的思想,去繁从简,很方便就能构建一个独立的.产品级别的应用. 1.传统J2EE开发的缺点 开发笨重.配置繁多复杂.开发效率 ...

  5. SqlServer 附加数据库出错

    方法一 找到要添加数据库的.mdf文件,点击右键,选择属性 在属性页面点击安全,选择Authenticated Users,单击编辑 Authenticated Users权限中选择完全控制,点击确定 ...

  6. DX使用随记--TabControl

    1. 关闭TabControl选项卡: Private Sub TabControl_Main_CloseButtonClick(sender As Object, e As EventArgs) H ...

  7. Python下载安装及验证

      目录: 一.Python介绍 二.python安装及验证 一.Python介绍 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个 ...

  8. css 之引入自定义字体/特殊字体-----使用ttf格式语言包

    1.准备好需要的 .ttf 格式的语言包,在css导入: @font-face { font-family: myFont; src: url('../assets/font/Oswald-SemiB ...

  9. shiro系列二、身份验证和授权

    一.身份验证 先来看看身份验证的流程 流程如下: 1.首先调用Subject.login(token)进行登录,其会自动委托给Security Manager,调用之前必须通过SecurityUtil ...

  10. 1.开始认识flask

    1. pip安装flask包pip install flask2.对flask最基本的使用from flask import Flask # 导入flask包 app = Flask(__name__ ...