java版数据结构——栈的实现

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();
	}
			
}

猜你喜欢

转载自blog.csdn.net/weixin_42870497/article/details/86761529