「javastack数组」javastack操作

博主:adminadmin 2023-01-07 04:18:07 1014

今天给各位分享javastack数组的知识,其中也会对javastack操作进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Java Stack Array

给你分析一下jdk中的集合。

JDK自带的实现了Array接口的数组 LinkedArray和ArrayList都是大小可变的,其中linked底层使用链表实现不必说,ArrayList底层虽然使用数组实现,但是当插入元素已满是,自动扩种默认元素个大小,所以不满足你的需求。Set和List接口继承了Collection的接口。他们的实现类TreeSet和HashSet以及LinkedLis和Listd都和数组实现类一样是自动扩充的。

所以jdk中找不到一个按你要求来的Collection实现类和Array实现类。

那么考虑解决方案:

第一种:使用数组代替 像楼上的两位说的,但是数组时不提供remove方法的,而且频繁操作的时候来其麻烦。使用如下

Stack[] stack=new Stack[3];

创建一个容量为3的数组,里面只能存放Stack.

第二种:实现Collection接口,写一个Colletion接口的实现类,虽然写的时候比较麻烦但是一劳永逸,Collection接口的实现类封装各种强大的方法,这样操作的时候就方便多了。可以将实现类的引用传给接口,面向接口编程使得程序的扩展性上了一个台阶。而且由于封装大大提高了复用性,比如判断是否包含一个元素 子要调用contains方法就ok了而不用每次都自己一个一个比较

我根据楼主的需求写了一个Collection的实现类。都组可以运行一下。

测试的类 Test 只测试了其中的一部分方法 其你可以测一下 有问题联系我

import java.util.*

public class Test{

/**

*测试用的主方法,应该拿到别的类中 此类为一个封装类

*为了给楼主看着方便就不提到别的类中了

*/

public static void main(String args[]) {

/**由于StackArray实现了Collection接口所以可以这么用

*也可以使用 StackArray stackArray = new StackArray(3)

*/

Collection stackArray = new StackArray(3);

StackString stack = new StackString();

stack.push("aaa");

stack.push("bbb");

stackArray.add(stack);

stackArray.add(stack);

stackArray.add(stack);

/*第四个加不进去了 超出了容量*/

stackArray.add(stack);

/*显示StackArray中元素的个数*/

System.out.println(stackArray.size());

/*判断是否为空*/

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

/**

*因为stackArray实现了Itorator 所以可以使用增强的for *循环遍历

*也可以改成普通的for循环 但是要输出其中的元素首先要*调用stackArray.toArray()方法

*将stackArray转换成数组 再循环遍历数组 比较麻烦

*/

for (Object o : stackArray) {

System.out.println(o);

}

/*清空*/

stackArray.clear();

/*判断是否为空*/

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

}

}

StackArray类:

import java.util.Collection;

import java.util.Iterator;

import java.util.Stack;

/***

*

* @author Administrator

* 这个类用来顺序的存储栈(Stack类型)的元素

* 数据结构采用数组的形式 这样做的目的是为了删除一个元素的时候保留其位置。

* 成员变量length记录数组的容量

* 成员变量size记录里面已有元素的个数

*/

public class StackArray implements Collection {

private int length;

private int size;

Stack[] stack = null;

/**

* 构造方法 创建一个栈数组 容量为length

*

* @param int类型 表示要创建的容器的容量

* @return 构造方法返回值为空

* */

public StackArray(int length) {

this.length = length;

stack = new Stack[length];

}

/**

* 添加一个栈

* @param Stack 表示类型 为要添加的栈

* @return 如果添加成功返回true 失败(数组已经满了)返回false

* */

public boolean add(Object entry) {

// TODO Auto-generated method stub

for (int i = 0; i length; i++) {

if(stack[i]==null){

stack[i]=(Stack)entry;

return true;

}

}

return false;

}

/**

* 将指定集合中的所有元素添加到StackArray

* @param 要添加的元素集

* @return 添加成功返回true

*/

public boolean addAll(Collection c) {

for (Object o : c) {

add(o);

}

return true;

}

/**

* 清除StackArray中的所有元素

* @param void

* @return void

*/

public void clear() {

for (int i = 0; i this.size(); i++) {

stack[i] = null;

}

}

/**

*判断Stack中是否包含指定元素o

*@param 指定元素

*@return包含返回true 不包含返回false

*/

public boolean contains(Object o) {

// TODO Auto-generated method stub

for (Stack s : stack) {

if (s == (Stack) o) {

return true;

}

}

return false;

}

/**

* 判断是否包含制定集合中所有的元素

* @param 想要判断的集合 集合里元素类型应该为Stack

* @return 如果集合中有元素师StackArray中没有的 返回false如果都有返回true

*/

public boolean containsAll(Collection c) {

// TODO Auto-generated method stub

for (Object o : c) {

if (contains(o)) {

} else {

return false;

}

}

return true;

}

/**

* 判断StackArray是否为空

* @param void

* @return 如果为空返回True 不为空返回false

*/

public boolean isEmpty() {

// TODO Auto-generated method stub

if (this.size() == 0) {

return true;

} else {

return false;

}

}

/**

* 删除StackArray中的制定元素 o

* @param 将要删除的元素

* @return 删除后返回ture

*/

public boolean remove(Object o) {

// TODO Auto-generated method stub

for (int i = 0; i length; i++) {

if (stack[i] == (Stack) o) {

stack[i] = null;

}

}

return true;

}

/**

* 移除StackArray中包含在Collection中的元素

* @param 装有要删除元素的集合

* @param 删除后返回true

*/

public boolean removeAll(Collection c) {

// TODO Auto-generated method stub

for (Object o : c) {

remove(o);

}

return true;

}

/**

* 计算StackArray中元素的个数

* @param void

* @return StackArray中元素的个数

*/

public int size() {

// TODO Auto-generated method stub

size = length;

for (int i = length - 1; i = 0; i--) {

if (stack[i] == null) {

size--;

} else {

break;

}

}

return size;

}

/**

* 将StackArray转换成数组

* @param void

* @return Object数组

*/

public Object[] toArray() {

// TODO Auto-generated method stub

return (Object[]) stack;

}

/**

* 将一个数组向上造型呈Object数组

* @param 任意类型的数组

* @Object数组

*/

public Object[] toArray(Object[] a) {

// TODO Auto-generated method stub

return (Object[]) a;

}

/**

* 内部类重写迭代器 用来迭代显示加入的栈

*@param void

*@return 自定义的迭代器 能够依次的显示StackArray中的栈

*/

@Override

public Iterator iterator() {

// TODO Auto-generated method stub

/**

* 重写迭代器接口中的方法 返回重写后的迭代器对象给接口的引用

*/

IteratorStack iterator = new IteratorStack() {

int index = 0;

@Override

public boolean hasNext() {

// TODO Auto-generated method stub

if (index = length) {

return false;

} else {

return true;

}

}

@Override

public Stack next() {

return stack[index++];

}

@Override

public void remove() {

// TODO Auto-generated method stub

StackArray.this.remove(stack[index]);

}

};

return iterator;

}

/**

* 留下StackArray中和Collection的交集

* @param 集合类

* 注意测方法尚未实现

*/

@Override

public boolean retainAll(Collection c) {

// TODO Auto-generated method stub

return false;

}

}

测试结果:

false

[aaa, bbb]

[aaa, bbb]

[aaa, bbb]

true

还有第三种解决方法:就是集成AarryList 然后覆盖父类方法,但是不推荐这个,因为要覆盖分方法太多还不如重写Collection了。

用一维整数数组实现数据结构中的堆栈(Stack)。(用java语言)

public class IntStack {

private int[] stack;

private int top;

/**

*初始化栈,传入一个非负的整数,否则抛出一个错误

*/

public IntStack(int size) throws StackErrorException{

if(size0){

throw new StackErrorException("错误的大小");

}

init(size);

}

private void init(int size) {

stack = new int[size];

top = 0;

}

/**

*判断栈是否为空,true则为空,反之则反

*/

public boolean isEmpty(){

return top==0;

}

/**

*判断栈是否已满,true则已满,反之则反

*/

public boolean isFull(){

return top==stack.length;

}

/**

*向栈顶添加元素,满则抛出异常

*/

public void push(int value) throws StackErrorException{

if(isFull()){

throw new StackErrorException("栈已满");

}

stack[top++] = value;

}

/**

*移除栈顶元素并返回,空则抛出异常

*/

public int pop() throws StackErrorException{

if(isEmpty()){

throw new StackErrorException("已到栈底!");

}

return stack[--top];

}

/**

*返回栈顶元素,空则抛出异常

*/

public int peek() throws StackErrorException{

if(isEmpty()){

throw new StackErrorException("已在栈底!");

}

return stack[top-1];

}

/**

*返回栈大小

*/

public int size(){

return stack.length;

}

class StackErrorException extends Exception{

public StackErrorException(String msg) {

super(msg);

}

}

}

java如何用数组来模拟栈的先进后出

import java.util.Arrays;

public class StackTest {

public static void main(String[] args) {

Stack stack = new Stack();

stack.put(1);

stack.put(2);

stack.put(3);

stack.put(4);

stack.show();

System.out.println(stack.push());

System.out.println(stack.push());

System.out.println(stack.push());

System.out.println(stack.push());

}

}

class Stack{

private int index;

private int length = 3;

private int[] stack;

public Stack() {

stack= new int[length];

index = 0;

}

public void put(int i){

if(index = length -1){

stack[index++] = i;

} else {

System.out.println("Stack 已满");

}

}

public int push(){

if (index 0){

return stack[--index];

}else {

System.out.print("Stack 已空");

return -1;

}

}

public void show() {

System.out.println(Arrays.toString(stack));

}

}

Java数组在内存中是什么样的

数组在内存中是一个连续的内存单元,大小根据类型和长度计算,二维数组,是多个一维数组的索引形成一个一维数组。所以在java中只有一维数组。

关于javastack数组和javastack操作的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。