详细图文——栈的使用案例:单词逆序和符号匹配检查

上一篇–>栈

案例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}");
	}
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值