基于数组和链表的栈实现

栈接口定义:

public interface Stack<Item> {

	/**
	 * 添加一个元素
	 * @param item
	 */
	public void push(Item item);
	
	/**
	 * 获取最后一个添加的元素,并将其从栈中删除
	 * @return
	 */
	public Item pop();
	
	/**
	 * 判断栈是否为空
	 * @return
	 */
	public boolean isEmpty();
	
	/**
	 * 获取栈当前的元素个数
	 * @return
	 */
	public int size();
}
基于数组的实现:

import java.util.Iterator;

import com.mycode.algorithms.stack.Stack;

/**
 * 基于数组的栈实现
 * @author imhuqiao
 */
public class ArrayStack<Item> implements Stack<Item>,Iterable<Item> {

	private Item[] data = null;
	private int pos = -1;
	
	public ArrayStack(){
		this(10);
	}
	
	public ArrayStack(int initLength){
		data = (Item[]) new Object[initLength];
	}
	
	@Override
	public void push(Item item) {
		pos++;
		if(pos==data.length){
			resize(data.length*2);
		}
		data[pos] = item;
		//print();
	}
	
	private void print(){
		System.out.print("[");
		for(Item d : data){
			System.out.print(d+",");
		}
		System.out.println("],pos="+pos);
	}

	@Override
	public Item pop() {
		if(isEmpty()){
			return null;
		}
		Item item = data[pos];
		data[pos] = null;
		pos--;
		if(pos > 0 && pos == data.length/4) resize(data.length/2);
		//print();
		return item;
	}

	@Override
	public boolean isEmpty() {
		return pos==-1;
	}

	@Override
	public int size() {
		return pos+1;
	}

	@Override
	public Iterator<Item> iterator() {
		return new ArrayStackIterator();
	}
	
	
	private void resize(int length){
		Item[] newdata = (Item[]) new Object[length];
		int i = 0;
		for(Item item : data){
			if(i<length){
				newdata[i] = data[i];
				data[i] = null;
			}
			i++;
		}
		data = newdata;
	}
	
	class ArrayStackIterator implements Iterator<Item>{
		private int i = pos;
		@Override
		public boolean hasNext() {
			return i>-1;
		}

		@Override
		public Item next() {
			Item result = data[i--];
			return result;
		}

		@Override
		public void remove() {
			
		}
	}
}

基于链表的实现:

import java.util.Iterator;

import com.mycode.algorithms.stack.Stack;

/**
 * 基于链表的栈实现
 * @param <Item>
 */
public class LinkStack<Item> implements Stack<Item>, Iterable<Item> {

	private Node<Item> head;
	private int count = 0;
	
	public LinkStack(){
		head = new Node<Item>();
	}
	
	
	@Override
	public Iterator<Item> iterator() {
		return new LinkStackIterator();
	}

	@Override
	public void push(Item item) {
		Node<Item> newNode = new Node<Item>();
		newNode.data = item;
		newNode.next = head;
		head = newNode;
		count++;
		print();
	}

	@Override
	public Item pop() {
		Item data = head.data;
		head = head.next;
		count--;
		print();
		return data;
	}

	@Override
	public boolean isEmpty() {
		return count == 0;
	}

	@Override
	public int size() {
		return count;
	}
	
	private void print(){
		Node<Item> node = head;
		System.out.print("[");
		while(node.next!=null){
			System.out.print(node.data+",");
			node = node.next;
		}
		System.out.println("]");
		
	}
	
	class Node<T>{
		public T data;
		public Node<T> next;
	}
	class LinkStackIterator implements Iterator<Item>{

		private Node<Item> theHead;
		private int theCount;
		
		public LinkStackIterator(){
			theHead =  new Node<Item>();
			theHead = head;
			theHead.next = head.next;
			this.theCount = count;
		}
		
		@Override
		public boolean hasNext() {
			return theCount>0;
		}

		@Override
		public Item next() {
			Item data = theHead.data;
			theHead = theHead.next;
			theCount--;
			return data;
		}

		@Override
		public void remove() {
			
		}
	}

}

测试代码:

	@Test
	public void testArrayStack(){
		Stack<String> as = new ArrayStack<String>(1);
		as.push("a");
		as.push("b");
		as.push("c");
		Assert.assertEquals("c",as.pop());
		String res = "";
		for(String str : as){
			res += str;
		}
		Assert.assertEquals("ba",res);
	}

	@Test
	public void testLinkStack(){
		Stack<String> ls = new LinkStack<String>();
		ls.push("a");
		ls.push("b");
		ls.push("c");
		Assert.assertEquals("c",ls.pop());
		String res = "";
		for(String str : ls){
			res += str;
		}
		Assert.assertEquals("ba",res);
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值