括号匹配问题(C语言,堆栈求解)

【问题描述】

在某个字符串(长度不超过100)中有左、右括号和大小写字母;规定任何一个左括号都从内到外与在它右边且距离最近的有括号匹配。写一个程序,找到无法匹配的左右括号,输出原来字符串,并在下一行为不能匹配的左右括号做标记。不能匹配的左括号用“$”标记,不能匹配的右括号用“?”标记。成功匹配的直接显示为空格(即不做标记)。

【思考】

括号匹配问题是堆栈的典型应用之一,每一个右括号必定与其之前未被匹配的左括号里头最右边的那个匹配。我们可以从左到右遍历字符串,遇到左括号就压入堆栈等待匹配,遇到右括号就检查堆栈,若堆栈为空,则无法匹配,标记?,若堆栈非空,则匹配成功,全部扫面完成后,检查堆栈是否有余下的左括号未被匹配,有的话标记$即可。

【源码】

#include <stdio.h>
#include <stack>
using namespace std;
stack<int> S; //定义一个堆栈 
char str[110];//保存输入字符串 
char ans[110];//保存输出字符串 

int main(){
	while(scanf("%s",str)!=EOF){
		int i;
		for(i=0;str[i]!=0;i++){//从左到右遍历字符串 
			if(str[i]=='('){//如遇左括号,压入堆栈 
				S.push(i);
				ans[i]=' '; //暂且将对应的输出字符串位置改为空格
			} 
			
			else if (str[i]==')'){//如遇右括号
				if(S.empty()==false){//如果堆栈非空 
					S.pop();
					ans[i]=' ';
				}
				else ans[i]='?';	//如果堆栈为空
			}
			
			else ans[i]=' ';//如遇其他字符
		}
		
		while(!S.empty()){//字符串遍历完成后,留在堆栈中的左括号无法匹配的话 ,修改器在输出中的位置为$ 
			ans[S.top()]='$'; 
			S.pop();//弹出
		}
		
		ans[i]=0;//为了使输出形成字符串,在其最后一个字符后添加一个空字符 
		//输出原字符串与答案字符串 
		puts(str);
		puts(ans);
	}
	
	return 0;
	
}

【运行结果】

第一行为输入,后两行为输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值