栈的创建------用数组实现栈

设计:

1、该数组存储对象类型在实例化是才确定-----泛型

2、数组的索引0是栈底

3、创建一个正整数变量top ----是栈顶元素否后的索引号

4、创建一个栈的接口----定义如下函数:

代码实现:

接口类:StackADT 



public interface StackADT <T> {
	/**
	 * 压栈
	 * @param t
	 */
	public void push(T t);
	/**
	 * 弹栈
	 * 弹出栈顶元素,并移除
	 * @return
	 * @throws EmptyCollectionException
	 */
	public T pop() throws EmptyCollectionException;
	/**
	 * 弹出栈顶元素不移除
	 * @return
	 * @throws EmptyCollectionException
	 */
	public T peek() throws EmptyCollectionException;
	/**
	 * 判断栈是否为空
	 * @return
	 */
	public boolean isEmpty();
	/**
	 * 栈当前存储的大小
	 * @return
	 */
	public int size();
	public String toString();
}

实现类:ArrayStack


/**
 * 用数组创建栈
 * 
 * @author Administrator
 * 
 * @param <T>
 */
public class ArrayStack<T> implements StackADT<T> {
	// 常量---存储容量
	private final int DEFAULT_CAPACITY = 100;
	// 栈顶表示 栈底----0
	private int top;
	private T[] stack;

	/**
	 * 默认容量
	 */
	@SuppressWarnings("unchecked")
	public ArrayStack() {
		top = 0;
		stack = (T[]) new Object[DEFAULT_CAPACITY];
	}

	/**
	 * 指定容量
	 * 
	 * @param initCapacity
	 */
	@SuppressWarnings("unchecked")
	public ArrayStack(int initCapacity) {
		top = 0;
		stack = (T[]) new Object[initCapacity];
	}

	@Override
	public void push(T t) {
		// 先判断数组是否已经满了
		if (size() == stack.length) {
			// 进行扩容
			expandCapacity();
		}
		stack[top] = t;
		top++;
	}

	/**
	 * 为数组扩容,实际就是 新建一个数组在将原来数据进行复制
	 */
	private void expandCapacity() {
		stack = Arrays.copyOf(stack, stack.length * 2);

	}

	@Override
	public T pop() throws EmptyCollectionException {
		// 判断数组是否为空
		if (isEmpty()) {
			throw new EmptyCollectionException("Stack");
		}
		T result= stack[top - 1];
		stack[top-1]=null;//弹出的值设置为null
		top--;//减少top计数器
		return result;
	}

	@Override
	public T peek() throws EmptyCollectionException {
		// 判断数组是否为空
		if (isEmpty()) {
			throw new EmptyCollectionException("Stack");
		}

		return stack[top - 1];
	}

	@Override
	public boolean isEmpty() {
		if (size() == 0) {
			return true;
		}
		return false;
	}

	@Override
	public int size() {
		return top;
	}
	
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		StackADT<String> strs=new ArrayStack<String>();
		try {
			strs.push("zhong");
			String str=strs.peek();
			System.out.println("strs.peek():"+str+" size:"+strs.size());
			String str2=strs.pop();
			System.out.println("strs.pop():"+str2+" size:"+strs.size());
		} catch (EmptyCollectionException e) {
			e.printStackTrace();
		}
	}
}

异常类:EmptyCollectionException 

public class EmptyCollectionException extends Exception {

	public EmptyCollectionException(String message) {
		super("The "+message+ " is empty.");
	}

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
类模板是 C++ 中的一种特殊类型,它允许您编写通用类,以适用于多个不同的数据类型。类模板中的成员函数和数据成员可以使用任何数据类型。使用类模板可以有效地减少重复的代码量,并且可以提高代码的可读性和可维护性。 下面是一个(stack)类的类模板示例,用于实现基本的功能: ``` template <class T> class Stack { private: T* stackArray; // 存储元素的数组指针 int stackSize; // 的最大大小 int top; // 顶元素的索引 public: // 构造函数 Stack(int size) { stackArray = new T[size]; stackSize = size; top = -1; } // 析构函数 ~Stack() { delete [] stackArray; } // 压操作 void push(T value) { if (top == stackSize - 1) { cout << "Stack is full!\n"; } else { top++; stackArray[top] = value; } } // 弹操作 void pop() { if (isEmpty()) { cout << "Stack is empty!\n"; } else { top--; } } // 返回顶元素值 T peek() { if (isEmpty()) { cout << "Stack is empty!\n"; return T(); } else { return stackArray[top]; } } // 判断是否为空 bool isEmpty() { return top == -1; } // 判断是否已满 bool isFull() { return top == stackSize - 1; } }; ``` 在此示例中,我们使用了类模板 `template <class T>`,其中 `T` 是通用数据类型的占位符。这个占位符可以被任何数据类型替换。例如,如果您想要创建一个存储整数类型的,则可以这样声明: ``` Stack<int> intStack(10); ``` 其中 `int` 是替换 `T` 的实际数据类型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值