学习心得
题目如下:
在某个字符串中有左、右括号(本算法只匹配小括号,有其他括号时类似处理,多增加几个选择分支即可)及大小写字母;写一个程序,找到无法匹配的左括号和右括号,输出原来的字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用“#”标注,不能匹配的右括号用“?”标注。
样例输入:
)(rttyy())ss)(
样例输出
)(rttyy())sss)(
? ?#
解题思路:本算法主要是堆栈的简单应用,不难
直接上代码吧:
#include<stdio.h>
#include<stack>
#include<string.h>
using namespace std;
stack<int> s;
int main()
{
char ch[100],ans[100];
int length,j;
char tmp;
while (scanf("%s",ch)!=EOF)
{
length = strlen(ch); //read me:
for (j = 0; j < length; j++) //int ans[100] 在采用每个元素单独赋值时,ans由字符串变成字符数组
{ //字符串本身默认以"\0"为结束标志,而变成字符数组后就没有结束标志
ans[j]=' '; //所以直接用%s打印字符素组时,数组中元素之后的存储单元会是乱码,%s只适用于打印字符串
}
ans[j]=0; //将ans重新变成字符串 也可以这样:ans[j]='\0';
for (int i = 0; i < length; i++)
{
switch (ch[i])
{
case '(':s.push(i);break; //左括号则进栈
case ')': //若为右括号
if(s.empty()) ans[i] = '?'; //栈空
else s.pop(); //匹配
break;
default: //其他情况
break;
}
}
while (!s.empty())
{
ans[s.top()]= '#';
s.pop();
}
printf("%s\n",ch);
printf("%s\n",ans);
}
return 0;
}
黑框输出结果: