Java中的栈-进阶版:双端栈(ArrayStackDoubleEnd)

双端栈:是指从一个线性表的两端当做栈底进行分别的入栈和出栈操作。

在这里插入图片描述先自定义一个栈接口:

public interface Stack <E>{
	public void push(E e); //进栈
	public E pop();//出栈
	public E peek();//获取栈顶元素
	public boolean isEmpty();//判断栈空
	public int getSize();//获取栈有效长度
	public void clear();//清空栈
}

双端栈具体实现:

import java.util.Arrays;

public class ArrayStackDoubleEnd <E> implements Stack<E>{
	public static final int L = 0;  //左端栈标记
	public static final int R = 1;  //右端栈标记
	private E[] data;	//元素容器
	private int left,right;//左右端栈顶
	private int size;  //栈中元素的总个数
	
	public ArrayStackDoubleEnd() {
		this(10);
	}
	
	public ArrayStackDoubleEnd(int capacity) {
		if(capacity<0) {
			System.out.println("长度不能为负数");
		}
		data = (E[]) new Object[capacity];
		left = -1;
		right = data.length;
		size = 0;
	}
	//自定义左右栈操作
	public void push(int which , E e) {
		if(size == data.length) {  //满 size==data.length left+1=right
			throw new IllegalArgumentException("栈已满!");
		}
		if(which==L) {
			data[++left] = e;
		}else {
			data[--right] = e;
		}
		size++;
	}
	public E pop(int which) {
		if(isEmpty(which)) {
			throw new IllegalArgumentException("栈已空");
		}
		size--;
		if(which==L) {
			return data[left--];
		}else {
			return data[right++];
		}
	}
	public int getCapacity() {
		return data.length;
	}
	public int getSize(int which) {
		if(which==L) {
			return left+1;
		}else {
			return data.length-right;
		}
	}
	public E peek(int which) {
		if(isEmpty(which)){
			throw new IllegalArgumentException("栈为空!");
		}
		if(which==L){
			return data[left];
		}else{
			return data[right];
		}
	}
	public boolean isEmpty(int which){
		if(which==L){
			return left==-1;
		}else{
			return right==data.length;
		}
	}
	public void clear(int which){
		if(which==L){
			left=-1;
		}else{
			right=data.length;
		}
	}
	//实现部分
	@Override
	public void push(E e) {
		if(size==data.length){
			throw new IllegalArgumentException("栈已满!");
		}
		if(getSize(L)<=getSize(R)){
			push(L,e);
		}else{
			push(R,e);
		}
	}
	@Override
	public E pop() {
		if(getSize(L)>=getSize(R)){
			return pop(L);
		}else{
			return pop(R);
		}
	}
	@Override
	public E peek() {
		if(getSize(L)>=getSize(R)){
			return peek(L);
		}else{
			return peek(R);
		}
	}
	@Override
	public boolean isEmpty() {
		return left==-1&&right==data.length&&size==0;
	}
	@Override
	public int getSize() {
		return size;
	}
	@Override
	public void clear() {
		left=-1;
		right=data.length;
		size=0;
	}
	
	@Override
	public String toString() {
		return Arrays.toString(data);
	}
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值