Talk is cheap show me the code.今天实现了栈的数据结构,只要前面的顺序表和链表基础过关,这个几乎就不在话下了。
栈的顺序存储结构
package com.chenli.Stack;
/**
* 基于数组实现的顺序栈
* @author 陈力
*
* @param <E>
*/
@SuppressWarnings("all")
public class MyStack<E> {
private Object []data = null;
private int maxsize = 0;//栈容量
private int top = -1;//栈指针
//构造函数
public MyStack(){
this(10);//给定栈初始化栈容量为10
}
public MyStack(int initialsize) {
if(initialsize>0){
this.maxsize = initialsize;
data = new Object[maxsize];
top = -1;
}else{
throw new RuntimeException("初始化不能小于0");
}
}
//判断是否为空
public boolean isEmpty(){
return top == -1 ? true:false;
}
//进栈,第一个元素top=0
public boolean push(E e){
if(top == maxsize -1){
throw new RuntimeException("栈已满");
}else{
data[++top] = e;
return true;
}
}
//查看栈顶元素但不移除
public E peek(){
if(top == -1){
throw new RuntimeException("栈为空");
}else{
return (E) data[top];
}
}
//弹出栈顶元素
public E pop(){
if(top == -1){
throw new RuntimeException("栈为空");
}else{
return (E) data[top--];
}
}
//查找对象在栈中的位置(从栈顶开始查找),以1为基数。
public int search(E e){
int i = top;//用i记录存储一开始top的位置
while(top != -1){
if(peek() != e){
top--;//移动栈指针
}else{
int result = i - top +1;//执行这一步说明找到了对象,记录对象的位置。记住栈的查询是以1为基数的,所以+1
top = i;//还原栈指针的位置,即指向第一个元素
return result;//把查找的位置返回
}
}
return -1;//执行到这一步是说明没找到
}
}
栈的链式存储结构
package com.chenli.Stack;
/**
* 栈的链式存储
* @author 陈力
*
*/
@SuppressWarnings("all")
public class MyLinkedStack {
private Node top;//定义栈顶元素
private int size;//定义当前栈的大小
//构造方法
public MyLinkedStack(){
this.top = null;
this.size = 0;
}
//栈的长度
public int length(){
return size;
}
//栈是否为空
public boolean isEmpty(){
return size == 0;
}
//入栈:让top指向新创建的元素,新元素的next引用指向原来的栈顶元素
public boolean push(Object e){
Node newNode = new Node(e);//生成要添加的新结点
if(top == null){//top指针为空的情况
top = newNode;//直接指向新的结点
}else{
newNode.next = top;//先让新结点next引用指向原先栈顶元素
top = newNode;//再让top指针指向新结点(这两步顺序不能搞反了)
}
size++;
return true;
}
//查看栈顶元素不移除
public Object peek(){
if(isEmpty()){
throw new RuntimeException("栈为空");
}else{
return top.data;
}
}
//出栈
public Object pop(){
if(isEmpty()){
throw new RuntimeException("栈为空");
}else{
Node removeNode = top;//得到栈顶元素,即为将要移除的元素
top = removeNode.next;//将栈指针指向将要移除的元素的下一位
removeNode.next = null;//将移除的元素的next指针域赋值为null
size--;
return removeNode.data;
}
}
}
LinkedList实现栈
package com.chenli.Stack;
import java.util.LinkedList;
/**
* LinkedList实现栈
* @author 陈力
*
*/
public class LinkedListStack {
private LinkedList<Object> list = new LinkedList<Object>();
//判断栈是否为空
public boolean isEmpty(){
return list.isEmpty();
}
//入栈
public void push(Object obj){
list.offerLast(obj);
}
//查看队首元素但不移除
public Object peek(){
return list.getLast();
}
//出栈
public Object pop(){
return list.pollLast();
}
//打印
public String toString(){
return list.toString();
}
}