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

本文介绍了一种特殊的栈——双端栈,并提供了详细的Java实现。双端栈允许从两端进行入栈和出栈操作,提高了灵活性。文章还定义了一个栈接口,并实现了栈的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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);
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值