<!-- Generated by javadoc (build 1.6.0-beta2) on Fri Mar 09 12:52:21 CST 2007 -->
Stack
类表示后进先出(LIFO)的对象堆栈。JDK中java.util.Stack通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。
数据项入栈和出栈的时间复杂度都为0(1),也就是说栈操作所耗费的时间不依赖于栈中数据项的个数,因此操作时间很短。栈不需要比较和移动操作。
栈应用:
1、单词逆序
将单词字符逐个入栈(push),最后逐个出栈(pop),实现了单词的逆序过程。不过JDK中java.lang.StringBuffer中实现了字符串逆序的方法reverse,该方法是通过一下方式来实现字符串的逆序的:
String st = new String("this is ok 可 以 吗ert tyu?");
char [] value = st.toCharArray();
int count =value.length;
int n = count - 1;
//此处通过位运算符来实现除以2操作,通过循环实现char数组内容的首尾互换
for (int j = (n-1) >> 1; j >= 0; --j) {
System.out.println(j);
char temp = value[j];
char temp2 = value[n - j];
value[j] = temp2;
value[n - j] = temp;
}
for (int i = 0; i < value.length; i++) {
System.out.println(value[i]);
}
2、分隔符匹配
栈经常被用于解析某种类型的文本串。大学时代学习过的汇编语言,编译器就是通过栈来解析计算机语言所写的代码的。
分隔符匹配程序从字符串中不断读取字符,每次读取一个字符,若发现它是左分隔符,就将它压入栈中,若读入一个右分隔符时,弹出栈顶的左分隔符,看是否匹配,若不匹配则报错,如果最后栈中存在未被匹配的左分隔符,也报错。
public void check()
{
int stackSize = input.length(); // get max stack size
StackX theStack = new StackX(stackSize); // make stack
for(int j=0; j<input.length(); j++) // get chars in turn
{
char ch = input.charAt(j); // get char
switch(ch)
{
case '{': // opening symbols
case '[':
case '(':
theStack.push(ch); // push them
break;
case '}': // closing symbols
case ']':
case ')':
if( !theStack.isEmpty() ) // if stack not empty,
{
char chx = theStack.pop(); // pop and check
if( (ch=='}' && chx!='{') ||
(ch==']' && chx!='[') ||
(ch==')' && chx!='(') )
System.out.println("Error: "+ch+" at "+j);
}
else // prematurely empty
System.out.println("Error: "+ch+" at "+j);
break;
default: // no action on other characters
break;
} // end switch
} // end for
// at this point, all characters have been processed
if( !theStack.isEmpty() )
System.out.println("Error: missing right delimiter");
} // end check()