扩号匹配问题



描述

在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算术式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用”$”标注不能匹配的右括号用”?”标注

输入

输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100

输出

对每组输出数据,输出两行,第一行包含原始输入字符,第二行由”$”“?”和空格组成,”$”和”?”表示与之对应的左括号和右括号不能匹配。

输入示例】

((ABCD(x)

)(rttyy())sss)(

输出示例】

((ABCD(x)

$$

)(rttyy())sss)(

?           ?$

C代码】

—————

#include<stdio.h>

#include<string.h>

#defineSTACK_SIZE 100

intmain(void) {

struct Bracket {

char ch;     /* 字符               */

int index;   /* 字符在字符串中的下标 */

};

struct Bracketstack[STACK_SIZE];        /* */

char str[STACK_SIZE];

int i, len;

inttop;                                 /*栈顶 */

while(scanf(“%s”, str) != EOF) {

printf(“%s\n”,str);                 /*输出原始输入字符串 */

len = strlen(str);

top = 0;

for(i = 0; i < len; ++i) {

if(str[i] == ‘(‘){              /*左括号直接进栈 */

stack[top].ch = str[i];

stack[top].index = i;

++top;

}

else if(str[i] == ‘)’) {

if(top == 0){                  /*栈空,右括号入栈 */

stack[top].ch = str[i];

stack[top].index = i;

++top;        

}

else {

if(stack[top – 1].ch =='(‘) /*若栈顶元素是左括号,则出栈 */

–top;

else{                       /*右括号入栈 */

stack[top].ch = str[i];

stack[top].index = i;

++top;                

}

}

}

}

/*将栈的每一个元素的index值所指向的str数组的下标对应的元素设置为$或?*/

for(i = 0; i < top; ++i) {

if(stack[i].ch == ‘(‘)

str[stack[i].index] =’$’;        /*不能匹配的左括号 */

else

str[stack[i].index] =’?’;        /*不能匹配的右括号 */

}

/*扫描str数组,假如不是$或?,则输出空格,否则输出对应元素的值 */

for(i = 0; i < len; ++i) {

if(str[i] != ‘$’ && str[i] != ‘?’)

printf(“”);                      /*输出空格 */

else

printf(“%c”, str[i]);

}

printf(“\n”);

}

return 0;

}

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/rabbit8848/article/details/41592763
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞