前几天有一个学C#的同学去一家公司面试,面试官给出了这样一道题:用C#代码实现一个自己的栈.
后来他打电话过来问我,由于我学的就是java,不过以前也对C#有点接触,语言都是相通的,我只是给他描述了下大概的思路,呵呵......
其实学过java的程序员都知道,Java中提供了另一个Stack对象,就是一个栈,但是后来自己想想,如果是我我能否用Java实现一个自己的栈呢?带着这个疑问就自己写了一个,也算是对自己的一个简单的考验吧,没准下次我去面试就遇上了这样的题目,那不是太幸运了,呵呵(想的美...).这篇文章留下来给自己当做笔记使用,也希望对路过的初学者有点帮助。
package com.rao.util;
import java.util.EmptyStackException;
import java.util.Stack;
public class MyStack<E> {
private E[] eleDates; //数组对象
private int topIndex; //最上一个元素(栈顶元素)的下标
private int count; //元素的个数
public MyStack(int size) {
this.eleDates = (E[])new Object[size]; //初始化数组长度
this.topIndex=-1; //初始化最后一个元素的下边
this.count = 0; //初始化元素的个数
}
public MyStack() {
this(10); //提供一个默认的构造函数,默认初始化数组的长度只能装10个元素
}
//压入
public void push(E obj){
if (isFull()) {
throw new ArrayIndexOutOfBoundsException("栈已经满了,不能再放入元素");
}else {
count++; //栈中元素的个数+1
this.eleDates[++topIndex]=obj; //在最后一个元素的后面增加当前元素
}
}
//弹出栈,并且弹出栈顶元素
public E pop(){
if (isEmpty()) {
throw new EmptyStackException();
}else {
count--; //栈中元素的个数-1
E movedObj = this.eleDates[topIndex];
this.eleDates[topIndex]=null; //设置被移除的对象为空
topIndex--; //栈的元素下标-1
return movedObj;
}
}
//弹出栈顶元素
public E peek(){
if (isEmpty()) {
throw new EmptyStackException();
}else {
return this.eleDates[topIndex];
}
}
//判断栈是否为空
public boolean isEmpty(){
return this.topIndex==-1;
}
//判断栈是否已满
public boolean isFull(){
return this.topIndex==(this.eleDates.length-1);
}
//获取栈的长度
public int getStackSize(){
return this.eleDates.length;
}
// 获取栈中元素的个数
public int getStackCount(){
return this.count;
}
@Override
public String toString() {
String stackString = "";
for (int i = 0; i < eleDates.length; i++) {
if (eleDates[i]!=null) {
stackString+=eleDates[i]+" | ";
}
}
return stackString;
}
public static void main(String[] args) {
MyStack<Integer> myStack = new MyStack<Integer>(5);
myStack.push(2);
myStack.push(100);
myStack.push(5);
myStack.push(12);
myStack.push(33);
System.out.println(myStack);
System.out.println(myStack.pop());
System.out.println(myStack);
System.out.println(myStack.pop());
System.out.println(myStack);
System.out.println(myStack.pop());
System.out.println(myStack);
}
}
运行结果:
2 | 100 | 5 | 12 | 33 |
33
2 | 100 | 5 | 12 |
12
2 | 100 | 5 |
5
2 | 100 |
参考文献:java 源代码;
分享到:
相关推荐
- **继承**:一个类可以继承另一个类的特性,实现代码重用。 - **多态**:同一种行为可以有不同的表现形式,如方法重载和覆盖。 - **抽象**:抽象类和接口用于定义行为规范,实现抽象和具体实现的分离。 3. **...
跳还是不跳,是一个问题——跳槽时该如何权衡?.docx 进入IT企业必读的324个JAVA面试题.pdf 阿里2015实习生-客户端笔试题目解析.docx 面试帮-IT面试宝典.apk 面试题 面试题库 高吞吐低延迟Java应用的垃圾回收优化....
跳还是不跳,是一个问题——跳槽时该如何权衡?.docx 进入IT企业必读的324个JAVA面试题.pdf 阿里2015实习生-客户端笔试题目解析.docx 面试帮-IT面试宝典.apk 面试题 面试题库 高吞吐低延迟Java应用的垃圾回收优化....
跳还是不跳,是一个问题——跳槽时该如何权衡?.docx 进入IT企业必读的324个JAVA面试题.pdf 阿里2015实习生-客户端笔试题目解析.docx 面试帮-IT面试宝典.apk 面试题库 高吞吐低延迟Java应用的垃圾回收优化.docx 黑马...
以上内容是根据"2021年JAVA开发面试题"这个主题推测出的可能涵盖的知识范围。由于提供的压缩文件列表仅包含.jpg图像文件,无法直接提供具体面试题目的详细内容。通常,面试题可能会以文字文档、PDF或文本文件的形式...
Java作为一门广泛使用的编程语言,其面试题涵盖了众多的知识领域,包括基础语法、面向对象、集合框架、多线程、网络编程、IO流、异常处理、JVM内存模型、设计模式、数据库操作、Spring框架等。以下是对这些知识点的...
8. **源文件中的多个类**:一个`.java`文件中可以包含多个类,但只能有一个公共类,且文件名必须与该公共类名相同。 9. **排序方法**:常见的排序算法包括冒泡排序、插入排序、快速排序等。 10. **Overload和...
- **重写**:发生在子类和父类之间,子类可以定义一个与父类具有相同签名(方法名和参数列表都相同)的方法,以覆盖父类的实现。 3. **转发(forward)与重定向(redirect)的区别:** - **转发**:服务器内部...
Java是一种广泛使用的面向对象的编程语言,以其平台独立性、高效性和丰富的类库而闻名。在2019年的面试中,Java开发者需要对各种核心概念有深入理解,包括但不限于语法、面向对象特性、集合框架、多线程、异常处理、...
5. **JVM内存管理**:面试官常常会询问Java内存模型,如堆内存、栈内存、方法区、本地方法栈,以及垃圾回收机制(GC)。理解对象的生命周期和内存分配,以及如何调优JVM参数,对于解决性能问题至关重要。 6. **IO流...
本压缩包"Java各种必备面试题目程序代码例子与应战技巧.zip"提供了丰富的面试题和实战代码,帮助你应对各种Java面试挑战。 1. **基础语法**: - 面试题:解释Java中的封装、继承和多态。 - 实战代码:创建简单的...
- 面试题:如何在Java中实现多线程? - 答案:可以通过继承Thread类或实现Runnable接口,然后通过Thread对象的start()方法启动线程。 6. **垃圾回收机制** - 面试题:解释Java的垃圾回收机制。 - 答案:Java...
首先,文档描述了一个名为“Java 最常见200道面试题.pdf”的文件,它是一个集合了互联网公司面试题的集锦,主要针对后台、客户端、测试、数据、算法等职位。文档强调了这些面试题对于准备面试的程序员具有很高的价值...
本资源是 Java 面试题大全,涵盖了 Java 及其相关技术栈的方方面面,包括 MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等。...
本资料“java基础面试题汇总,通过代码的方式理解面试题.zip”正是为帮助开发者准备Java面试而设计的,它包含了大量常见的Java基础面试题,并提供了相应的代码示例来加深理解。 一、Java基础概念 1. 类与对象:Java...
封装是JAVA面向对象编程的一个核心原则,它通过将数据和操作数据的方法封装在一起,保护数据不被外部代码直接访问和修改,从而提高了代码的安全性和维护性。Java的封装通过使用访问修饰符(如public, private, ...
8. **MyBatis**:MyBatis是一个持久层框架,它将SQL语句与Java代码分离,简化了数据访问。面试者需了解Mapper接口的使用,动态SQL的编写,以及MyBatis的缓存机制。 9. **JVM虚拟机**:面试者应掌握JVM内存模型(堆...
Java作为全球最流行的编程语言之一,其面试题和笔试题是评估开发者技能的重要标准。这份“Java面试题笔试题大全”资源旨在帮助求职者全面准备Java相关的技术面试和笔试环节,提升成功几率。CHM(Compiled Help ...
3. **软件开发技术**:文档中提及“J2EE”(JAVA 2 Platform, Enterprise Edition),这是一个主要针对企业级应用开发的技术平台,需要项目经理对J2EE所涉及的技术栈如Servlet、JSP、EJB等有实际的经验和理解。...