栈的应用:

  undo操作-编辑器

  系统调用栈-操作系统

  括号匹配-编译器

以下是动态数组实现的数组栈:

定义动态数组:

package Date_pacage;

public class Array<E> {
//叫它静态数组
//private int[] data;
private E[] data;
private int size;
//构造函数
public Array(int capacity) {
data = (E[])new Object[capacity];
size = 0;
}
//无参数的构造函数,默认数组的容量为10
public Array() {
this(10);
}
public int getSize() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public int getCapacity() {
return data.length;
}
// O(1)
public void addLast(E e) {
add(size, e);
}
// O(n)
public void addFirst(E e) {
add(0, e);
}
// O(n/2) = O(n)
public void add(int index, E e) {
if(size>=data.length)
resize(2 *data.length);
if(index<0 || index>size)
throw new IllegalArgumentException("Add failed.index is error.");
for(int i=size-1;i>=index;i--) {
data[i+1] = data[i];
}
data[index] = e;
size++;
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array: size = %d, capacity = %d\n", size, data.length));
res.append("[");
for(int i = 0 ; i<size ; i++) {
res.append(data[i]);
if(i != size - 1)
res.append(", ");
}
res.append("]");
return res.toString();
}
public E get(int index) {
if(index < 0 || index >= size)
throw new IllegalArgumentException("Get failed. Index is illegal");
return data[index];
}
public E getFirst() {
return get(size - 1);
}
public E getLast() {
return get(0);
}
void set(int index, E e) {
if(index < 0 || index >= size)
throw new IllegalArgumentException("Get failed. Index is illegal");
data[index] = e;
}
public boolean contains(E e) {
for(int i = 0; i < size; i++) {
if(data[i].equals(e))
return true;
}
return false;
}
public int find(E e) {
for(int i = 0; i < size; i++) {
if(data[i].equals(e))
return i;
}
return -1;
}
public E remove(int index) {
if(index < 0 || index >= size)
throw new IllegalArgumentException("Get failed. Index is illegal");
E res = data[index];
for(int i = index; i<size; i++) {
data[i] = data[i+1];
}
size--;
//释放空间,也可以不写
//loitering objects != memory leak
data[size] = null;
if(size == data.length / 4 && data.length / 2 != 0)
resize(data.length / 2);
return res;
}
public E removeFirst() {
return remove(0);
}
public E removeLast() {
return remove(size-1);
}
//只删除了一个e,并不能保证删除了全部e
public void removeElement(E e) {
int index = find(e);
if(index != -1)
remove(index);
}
private void resize(int newCapacity) {
E[] newData = (E[]) new Object[newCapacity];
for(int i=0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
}

定义Stack接口:

package Date_pacage;

public interface Stack<E> {
int getSize();
boolean isEmpty();
void push(E e);
E pop();
E peek();
}

定义ArrayStack:

package Date_pacage;

public class ArrayStack<E> implements Stack<E> {
Array<E> array;
public ArrayStack(int capacity) {
array = new Array<>(capacity);
}
public ArrayStack() {
array = new Array<>();
}
@Override
public int getSize() {
return array.getSize();
}
@Override
public boolean isEmpty() {
return array.isEmpty();
}
public int getCapacity() {
return array.getCapacity();
}
@Override
public void push(E e) {
array.addLast(e);
}
@Override
public E pop() {
return array.removeLast();
}
@Override
public E peek() {
return array.getLast();
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append("STACK:");
res.append("[");
for(int i = 0 ; i < array.getSize() ; i++) {
res.append(array.get(i));
if(i != array.getSize()-1)
res.append(", ");
}
res.append("] top");
return res.toString();
}
}

最新文章

  1. 支持新版chrome,用webstorm编译形成css和sourcemap,调试sass和less源文件(转)
  2. Caffe训练好的网络对图像分类
  3. Rabin-Miller算法
  4. C#中问号的使用
  5. 登陆整合实现-QQ互联认证(ASP.NET版本)
  6. Qt5:窗口各类位置
  7. ubuntu14.04 + OpenCV2.4.9 配置方法
  8. 权限管理系统之项目框架搭建并集成日志、mybatis和分页
  9. 第五节: Quartz.Net五大构件之Trigger的四大触发类
  10. Android-XML
  11. 2017-12-15python全栈9期第二天第三节之使用while循环输出0到10
  12. Vue系列之 =&gt; 自定义键盘修饰符
  13. Python爬虫框架Scrapy
  14. C# listbox DataSource数据绑定--一年半以前的bug
  15. JAVA中如何取得一个变量的类型
  16. bzoj3295 动态逆序对
  17. shell 编程笔记
  18. MQTT-SN协议乱翻之消息格式
  19. vue.js(三)
  20. 采用OpenReplicator解析MySQL binlog

热门文章

  1. IFC数据模式架构的四个概念层详解说明
  2. python 获取路径不同方法的比较
  3. 并发调试和JDK8新特性
  4. String、StringBuffer与StringBuilder之间区别 .RP
  5. mingw和libcurl
  6. Python中list常用的10个基本方法----list的灰魔法
  7. 小小c#算法题 - 7 - 堆排序 (Heap Sort)
  8. markdown编辑器使用教程
  9. 读取txt文件的简易算法
  10. Binder学习笔记(四)—— ServiceManager如何响应checkService请求