栈是一种先进后出的数据结构, 定义栈需要实现的接口:
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语言)数组实现以及链表实现源码,以及各个功能测试代码函数等 和后缀式转前缀式的用例
C++ 用数组实现一个栈 很经典的 大家可以看看 学习学习
学习数据结构过程中,亲自在VC++上编译通过的使用数组实现的顺序栈的源代码,与大家共享。
数组实现双端栈 数据结构!!! 顶 利用数组实现双端栈,插入,删除
用数组实现对栈的操作,如入栈,退栈,清空,输出等
用数组实现对栈的基本操作:出栈、入栈
由数组实现栈的功能,包括栈的创建、出栈和入栈,再通过打印显示出栈结果。正在学习数据结构的同学可以参考
使用一个数组实现三个栈的数据结构,满足当数组没有占满时,任意栈都能继续push数据。包含一个简易的C#图形测试界面。
一个一维数组实现两个栈的操作,头尾开始,节省空间
java api 中也有stack,这个是根据stack的特性编写出来的; 此程序在功能上和java提供的功能是一样的,只是实现的方法不一样;
数组实现栈.py
用数组实现的类似栈功能的C语言后缀表达式算法
栈关于数组与链表的实现,linux c语言
python利用数组和链表实现栈和队列 数组和链表.pdf
使用数组实现的两端栈 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材
用数组设计堆栈,主要实现push,pop操作, 并判断是否上衣下一
Java-用数组实现栈-队列-线性列表(最详细) 有注释 适合java新生 进行数组的练习 3个数据结构的数组实现练习
自制的用数组栈实现表达式求值,能实现()的匹配问题。程序不完善,功能有限,敬请谅解! 作者:sharlon123 QQ:370854700