![](http://www.atcpu.com/themes/extres/ithread/images/4.gif) | 起因: 周一是我女朋友的生日,无奈公司的接口需要我去调试,心里也确实放不下公司的事情,结果周末两天都在公司调试加班,今天周一我和女友都上班,唉,太感谢我女友了,一个男人的高度很大程度上取决于身边的女人啊,祝我宝贝璐璐生日快乐。 题目要求: 在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注. 输入: 输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。 注意:cin.getline(str,100)最多只能输入99个字符! 输出: 对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。 样例输入: )(rttyy())sss)( 样例输出: )(rttyy())sss)( ? ?$ 算法思想: 括号匹配是典型的栈的应用,因此我采用链栈,思路如下: (1)第一次遍历输入字符串, 1.是左括号,则入栈,同时标记数组的相应位置置空格 2.是右括号,则检测栈是否为空,不为空,则判断有对应的左括号,同时出栈;为空,则没有对应的左括号,标记数组置‘?’ (2)第二次遍历输入字符串, 1.是右括号,则入栈 2.是左括号,则检测栈是否为空,不为空,则判断有对应的右括号,同时出栈;为空,则没有对应的左括号,标记数组置‘$’ 代码实现如下: [cpp] #include <stdio.h> #include <stdlib.h> #include <string.h> //采用链栈的数据结构 struct stacknode { char bracket; struct stacknode *next; }; typedef struct { struct stacknode *top; }linkstack; /** * Description:初始化链栈 */ void initstack(linkstack *s) { s -> top = NULL; } /** * Description;判断栈是否为空 */ int stackempty(linkstack *s) { int flag; flag = (s -> top == NULL)? 1 : 0; return flag; } /** * Description:入栈操作 */ void push(linkstack *s, char str) { struct stacknode *p; p = malloc(sizeof(struct stacknode)); p -> bracket = str; p -> next = s -> top; s -> top = p; } /** * Description:出栈操作 */ char pop(linkstack *s) { char str; struct stacknode *p = s -> top; str = p -> bracket; s -> top = p -> next; free(p); return str; } int main() { char input[101]; char flag[101]; char ch; int i, len, j, k; linkstack *s; s = malloc(sizeof(linkstack)); while(scanf("%s",input) != EOF) { len = strlen(input); initstack(s); for(i = 0; i < len; i ++) { switch(input) { case '(': //左括号入栈 push(s,input); flag = ' '; break; case ')': //判断栈空 if(stackempty(s)) { flag = '?'; }else { flag = ' '; ch = pop(s); } break; default: flag = ' '; break; } } initstack(s); for(i = len - 1; i >= 0; i --) { switch(input) { case ')': //右括号入栈 push(s,input); break; case '(': //判断栈空 if(stackempty(s)) { flag = '$'; }else { flag = ' '; ch = pop(s); } break; default: break; } } //打印输出 printf("%s\n%s\n",input,flag); memset(input,'\0',sizeof(input)); memset(flag,'\0',sizeof(flag)); } return 0; }
| |