栈是一种先进后出的数据结构, 定义栈需要实现的接口:
public interface MyStack<T> {
/**
* 判断栈是否为空
*/
boolean isEmpty();
/**
* 清空栈
*/
void clear();
/**
* 栈的长度
*/
int length();
/**
* 数据入栈
*/
boolean push(T data);
/**
* 数据出栈
*/
T pop();
//取栈顶元素
public T peek();
}
栈的数组实现, 底层使用数组:
public class MyArrayStack<T> implements MyStack<T> {
private Object[] objs = new Object[16];
private int size = 0;
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public void clear() {
// 将数组中的数据置为null, 方便GC进行回收
for (int i = 0; i < size; i++) {
objs[size] = null;
}
size = 0;
}
@Override
public int length() {
return size;
}
@Override
public boolean push(T data) {
// 判断是否需要进行数组扩容
if (size >= objs.length) {
resize();
}
objs[size++] = data;
return true;
}
/**
* 数组扩容
*/
private void resize() {
Object[] temp = new Object[objs.length * 3 / 2 + 1];
for (int i = 0; i < size; i++) {
temp[i] = objs[i];
objs[i] = null;
}
objs = temp;
}
@SuppressWarnings("unchecked")
@Override
public T pop() {
if (size == 0) {
return null;
}
return (T) objs[--size];
}
@SuppressWarnings("unchecked")
@Override
public T peek(){
if(size==0)
return null;
return (T) objs[size-1];
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("MyArrayStack: [");
for (int i = 0; i < size; i++) {
sb.append(objs[i].toString());
if (i != size - 1) {
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
}
}
栈的应用举例
1. 将10进制正整数num转换为n进制
private String conversion(int num, int n) {
MyStack<Integer> myStack = new MyArrayStack<Integer>();
Integer result = num;
while (true) {
// 将余数入栈
myStack.push(result % n);
result = result / n;
if (result == 0) {
break;
}
}
StringBuilder sb = new StringBuilder();
// 按出栈的顺序倒序排列即可
while ((result = myStack.pop()) != null) {
sb.append(result);
}
return sb.toString();
}
2. 检验符号是否匹配. '['和']', '('和')'成对出现时字符串合法.
例如"[][]()", "[[([]([])()[])]]"是合法的; "([(])", "[())"是不合法的.
遍历字符串的每一个char, 将char与栈顶元素比较. 如果char和栈顶元素配对,
则char不入栈, 否则将char入栈. 当遍历完成时栈为空说明字符串是合法的.
public boolean isMatch(String str) {
MyStack<Character> myStack = new MyArrayStack<Character>();
char[] arr = str.toCharArray();
for (char c : arr) {
Character temp = myStack.pop();
// 栈为空时只将c入栈
if (temp == null) {
myStack.push(c);
}
// 配对时c不入栈
else if (temp == '[' && c == ']') {
}
// 配对时c不入栈
else if (temp == '(' && c == ')') {
}
// 不配对时c入栈
else {
myStack.push(temp);
myStack.push(c);
}
}
return myStack.isEmpty();
}
文章来自:http://coolxing.iteye.com/blog/1468674
分享到:
相关推荐
该篇是ubuntu上用数组实现栈,里面包括了,其push pull clear display等操作,在调试的时候我想到了引用传递,但是编译不过所以改用了指针,大家可以再尝试一下传引用的方法。可能是我的文件头不对,所以编过的同学...
栈的实现(C语言)数组实现以及链表实现源码,以及各个功能测试代码函数等 和后缀式转前缀式的用例
这些操作在数组实现的栈中可以直接通过数组索引来完成。 1. **数组定义与初始化** 在C++中,我们可以通过定义一个固定大小的数组来模拟栈的数据存储。例如,我们可以定义一个大小为10的整数数组来存储栈元素: `...
学习数据结构过程中,亲自在VC++上编译通过的使用数组实现的顺序栈的源代码,与大家共享。
数组实现双端栈的步骤如下: 1. 初始化:创建一个固定大小的数组,设定两个栈顶指针,一个初始值为0,表示前栈的栈顶;另一个初始值设为数组长度减1,表示后栈的栈顶。 2. 插入操作: - 前栈插入(PushFront):...
用数组实现对栈的操作,如入栈,退栈,清空,输出等
用数组实现对栈的基本操作:出栈、入栈
本话题聚焦于使用一个数组实现三个栈的数据结构。这样的设计旨在优化内存使用,提高效率,并允许在数组未满的情况下,任意一个栈都可以持续进行push操作。 首先,让我们理解栈的基本概念。栈是一种线性数据结构,...
由数组实现栈的功能,包括栈的创建、出栈和入栈,再通过打印显示出栈结果。正在学习数据结构的同学可以参考
一个一维数组实现两个栈的操作,头尾开始,节省空间
链表实现的栈在空间效率上可能不如数组实现的栈,因为每个节点都需要额外的空间存储指针,但在处理大量数据且频繁的动态扩展时,链表的性能更优,因为它不需要像数组那样移动元素。 总之,Java中的栈可以通过数组或...
1. **优点**:数组实现的栈空间连续,访问效率高,因为内存的随机访问特性使得在栈顶进行插入和删除操作的时间复杂度为O(1)。 2. **缺点**:固定大小,如果预先不知道栈的最大容量,可能会造成空间浪费;若栈的大小...
循环数组实现队列 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。队列的操作受限制,和栈一样,它是一种操作受限制的线性表。进行插入操作的...
java api 中也有stack,这个是根据stack的特性编写出来的; 此程序在功能上和java提供的功能是一样的,只是实现的方法不一样;
数组实现栈.py
使用动态数组实现栈 以下是一个简单的动态数组栈实现: ```cpp #include class MyStack { private: int* arr; // 动态数组 int capacity; // 当前容量 int size; // 当前元素个数 public: // 构造函数 ...
在数组实现线性表时,我们首先需要理解数组的基本概念。数组是一种数据结构,它将相同类型的元素存储在一个连续的内存区域中,可以通过索引来访问每个元素。数组的索引通常从0开始,因此一个包含n个元素的数组,其...
2. 数组实现栈: - **数组栈定义**:数组栈是基于固定大小数组的栈,通过调整数组下标来模拟栈顶元素的增加和减少。 - **数组栈操作**:数组栈的入栈是在数组的末尾添加元素,而出栈则是从数组末尾移除元素,同时...