案例1:单词逆序
不使用栈我们的方法是对称位置交换的方法:
我们可以利用栈后进先出原则我们可以很简便的实现逆序:
实现代码:
//使用栈实现单词逆序
public class WordReverse {
public static void main(String[] args) {
String str = "Hello,My name is CSDN.I am a blog.";
CharStack charStack = new CharStack(str.length());//创建栈,用于存放字符
for(int i=0;i<str.length();i++){
charStack.Push(str.charAt(i));
}
String reverseWord = "";
while(!charStack.isEmpty()){
reverseWord += charStack.Pop();
}
System.out.println(reverseWord);
}
}
案例2:符号匹配检查
通常用栈检查输入的文本中符号是否匹配,比如:
a[d]:匹配
c[d]a([e]:不匹配,无")"
能使用栈进行检查的原因是从左至右先出现的符号最后匹配,这刚好符合栈的先进后出原则。
算法描述:
①、逐个字符扫描文本,将扫描到的左侧符号入栈;
②、如果扫描到右侧符号,则出栈,判断出栈的符号和扫描到的右侧符号是不是一对的,一旦不匹配则检查失败,否则成功。
下面通过两个例子来说明这一算法过程:
1、检查a{b(c[d]e)f}
扫描到的字符 | 栈的操作 | 栈中内容 | 匹配结果 |
---|---|---|---|
a | - | ||
{ | 入栈(Push) | { | |
b | - | { | |
( | 入栈(Push) | {( | |
c | - | {( | |
[ | 入栈(Push) | {([ | |
d | - | {([ | |
] | 出栈(Pop)–>[,比较 | {( | success |
e | - | {( | |
) | 出栈(Pop)–>(,比较 | { | success |
f | - | { | |
} | 出栈(Pop)–>{,比较 | success |
扫描完毕!全部比较的匹配结果都成功,文本中的符号是匹配的。
2、检查a{b(c[de)f}
扫描到的字符 | 栈的操作 | 栈中内容 | 匹配结果 |
---|---|---|---|
a | - | ||
{ | 入栈(Push) | { | |
b | - | { | |
( | 入栈(Push) | {( | |
c | - | {( | |
[ | 入栈(Push) | {([ | |
d | - | {([ | |
e | - | {([ | |
) | 出栈(Pop)–>[,比较 | { | error |
扫描过程出现匹配错误,文本符号不匹配!
实现代码:
//检查符号是否匹配
public static void check(String str){
CharStack charStack = new CharStack(10);
for(int i=0;i<str.length();i++){
char ch = str.charAt(i);
char popCh=' ';
switch(ch){
case '{':
case '(':
case '[':charStack.Push(ch);break;
case '}':
case ')':
case ']':popCh = charStack.Pop();break;
}
if((ch=='}' && popCh!='{')||(ch==')' && popCh!='(')||(ch==']' && popCh!='[')){
System.out.println(ch +"与"+popCh+"不匹配");
return;
}
}
System.out.println("文本符号匹配成功!");
}
测试:
public class SymbolMatch {
public static void main(String[] args) {
check("a{b(c[d]e)f}");
check("a{b(c[de)f}");
}
}