OpenJudge计算概论-扩号匹配问题【这个用到了栈的思想】
/*======================================================================
扩号匹配问题
总时间限制: 1000ms 内存限制: 65536kB
描述
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注.
输入
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100
注意:cin.getline(str,100)最多只能输入99个字符!
输出
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。
样例输入
((ABCD(x)
)(rttyy())sss)(
样例输出
((ABCD(x)
$$
)(rttyy())sss)(
? ?$ 思路:
输入一组数据后(一个字符串,这里输入到数组a),先输出数组a
统计数组a的长度len,设置数组b代表的栈的栈顶end指向0. (注意把end清零)
然后扫描检测数组a,遇到左括号之间进栈(数组b代表的栈的元素存储进栈的
那个字符以及该字符在字符串a中的下标。)遇到右括号则按下面法则处理:
假如数组b代表的栈是空的(即end为0),则右括号进栈。
假如b不是空的(end大于0),则检测栈顶元素(下标是end-1)
是否是左括号,如果刚好是左括号则该栈顶元素出栈(end自己减1),
假如栈顶元素(下标是end-1)不是左括号,则该右括号进栈。 注意:这里end是指向栈顶元素的下一个位置。也就是说某一次进栈后end自己加1,
而栈顶元素下标是end-1。 另外:扫描完后,b数组的下标应该是0到end-1.扫描该数组,
按b的每一个元素的num值所指向的a数组的下标对应的元素设置为$或?
然后扫描a数组,假如不是$或?则输出空格,否则输出对应元素的值 然后处理下一组数据(但是要注意处理下一组数据前要把end清零。)
========================================================================*/
#include<stdio.h>
#include<string.h>
struct s
{
char ch;
int num;
};
int main()
{
char a[];
struct s b[];
int i,len;
int end=;//指向b数组代表的栈的栈顶
freopen("5.in","r",stdin);
while(scanf("%s",a)!=EOF)
{
printf("%s\n",a);
len=strlen(a);
end=;
for(i=;i<len;i++)
{
if(a[i]=='(')//左括号直接进栈(因为它不可能使栈顶元素出栈的。)
{
b[end].ch=a[i];
b[end].num=i;
end++;
}
else if(a[i]==')')
{
if(end==)//b数组代表的栈是空的
{
b[end].ch=a[i];
b[end].num=i;
end++;
}
else
{
if(b[end-].ch=='(')
{
end--;
}
else
{
b[end].ch=a[i];
b[end].num=i;
end++;
}
}
}
}
for(i=;i<end;i++)
{
if(b[i].ch=='(')
{
a[b[i].num]='$';
}
else
{
a[b[i].num]='?';
}
}
for(i=;i<len;i++)
{
if(a[i]!='$'&&a[i]!='?')
{
printf(" ");
}
else printf("%c",a[i]);
}
printf("\n");
/*for(i=0;i<end;i++)
{
printf("%c ",b[i].ch);
}
printf("\n");
for(i=0;i<end;i++)
{
printf("%d ",b[i].num);
}
printf("\n");*/
}
return ;
}
OpenJudge计算概论-扩号匹配问题【这个用到了栈的思想】的更多相关文章
- OpenJudge计算概论-取石子游戏
OpenJudge计算概论-取石子游戏[函数递归练习] /*====================================================================== ...
- Openjudge计算概论——数组逆序重放【递归练习】
/*===================================== 数组逆序重放 总时间限制:1000ms 内存限制:65536kB 描述 将一个数组中的值按逆序重新存放. 例如,原来的顺 ...
- OpenJudge计算概论-计算书费
/*============================================== 计算书费 总时间限制: 1000ms 内存限制: 65536kB 描述 下面是一个图书的单价表: 计算 ...
- OpenJudge计算概论-最高的分数
/*======================================================== 最高的分数 总时间限制: 1000ms 内存限制: 65536kB 描述 孙老师 ...
- OpenJudge计算概论-排队游戏【这个用到了栈的思想】
/*======================================================================== 排队游戏 总时间限制: 1000ms 内存限制: ...
- Openjudge计算概论-求序列中的众数
/*===================================== 求序列中的众数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个长度为N的整数序列 (不多于128 ...
- OpenJudge计算概论-找最大数序列
/*===================================== 找最大数序列 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n行(n 不大于 30),每行不超过10 ...
- OpenJudge计算概论-比饭量【枚举法、信息数字化】
/*====================================================================== 比饭量 总时间限制: 1000ms 内存限制: 655 ...
- Openjudge计算概论-角谷猜想
/*===================================== 角谷猜想 总时间限制: 1000ms 内存限制: 65536kB 描述 所谓角谷猜想,是指对于任意一个正整数,如果是奇数 ...
随机推荐
- 黑马程序员——【Java基础】——String、StringBuffer和基本数据包装类
---------- android培训.java培训.期待与您交流! ---------- 类String---------------------------------------------- ...
- iOS开发 获取手机信息(UIDevice,NSBundle,NSlocale)
在开发中,需要获取当前设备的一些信息,可以通过UIDevice,NSbundle,NSlocale获取. UIDevice UIDevice 提供了多种属性,类函数及状态通知,可以检测手机电量,定位, ...
- 6、网页制作Dreamweaver(HTML结构--dom操作)
一.基本语法:数据类型(字符串,小数,整数,布尔,时间) var, var s = "3.14"; var n = parseFloat(s); ; s += 5; var d = ...
- POJ 1269 (直线求交)
Problem Intersecting Lines (POJ 1269) 题目大意 给定两条直线,问两条直线是否重合,是否平行,或求出交点. 解题分析 主要用叉积做,可以避免斜率被0除的情况. 求交 ...
- Linux 基础入门(新版)(实验一至实验四)
1.实验一 Lniux简介 操作系统:系统调用+内核 Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体验欠缺:有全球所有的 Linux ...
- ARM Mysql c 通信
/************************************************************************************ * ARM Mysql c ...
- LeetCode Kth Largest Element in an Array (快速排序)
题意: 在一个无序的数组中第k大的数是多少? 思路: 按照快排的思路,如果每次分成两段后,设为L和R.如果R>=k ,则答案在右边集合,否则在左边集合. 这里用了3位取中法.注意快排别给写死循环 ...
- Weblogic项目部署及数据源配置
号线项目总结: weblogic项目配置: 把工作区放到磁盘上,建立weblogic域 在安装的weblogic服务器的开始项里选择 进入weblogic域的建立. 建立完域后用Myeclipse打开 ...
- getDefinitionByName getDefinition 区别
一闺密用flash开发IOS应用是遇到一个问题,她把声音资源放到swf里,然后load到主程序中使用,但是ios提示不支持这个swf,我在想是不是因为有声音的原因 于是我让她换种做法,不用swf,用s ...
- centos 用户组
centos 用户组和用户的添加及所属问题 指定附加组 eg:dy 为组名 ,lisi 为用户,要把lisi 用户添加到 dy 组里面 useradd -G dy lisi 可以同时添加多个组, ...