前几天有一个学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 源代码;