自学内容网 自学内容网

扩号匹配问题


💐The Begin💐点点关注,收藏不迷路💐

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

输入

输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100
注意:cin.getline(str,100)最多只能输入99个字符!

输出

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

样例输入

((ABCD(x)
)(rttyy())sss)(

样例输出

((ABCD(x)
$$
)(rttyy())sss)(
?            ?$

C语言代码

#include <stdio.h>
#include <string.h>

#define MAX_LENGTH 100

// 检查括号匹配情况并输出标注结果的函数
void checkBrackets(char *str) {
    int len = strlen(str);
    int stack[MAX_LENGTH];  // 模拟栈,用于存储左括号的索引
    int top = -1;
    char marks[MAX_LENGTH] = {0};  // 用于记录括号标注情况,初始化为全0
    for (int i = 0; i < len; i++) {
        if (str[i] == '(') {
            stack[++top] = i;  // 将左括号的索引入栈
        } else if (str[i] == ')') {
            if (top >= 0) {
                top--;  // 有匹配的左括号,出栈
            } else {
                marks[i] = '?';  // 没有匹配的左括号,标注为?
            }
        }
    }
    while (top >= 0) {
        marks[stack[top--]] = '$';  // 剩余在栈中的左括号标注为`$`
    }
    printf("%s\n", str);
    for (int i = 0; i < len; i++) {
        if (marks[i] == '$' || marks[i] == '?') {
            printf("%c", marks[i]);
        } else {
            printf(" ");
        }
    }
    printf("\n");
}

int main() {
    char str[MAX_LENGTH];
    while (gets(str)!= NULL) {  // 循环读取输入的字符串,直到文件结束
        checkBrackets(str);
    }
    return 0;
}

C++ 代码

#include <iostream>
#include <string>
#include <stack>
using namespace std;

// 检查括号匹配情况并输出标注结果的函数
void checkBrackets(const string &str) {
    stack<int> s;  // 定义栈,用于存储左括号的索引
    string marks(str.size(),'');  // 初始化标注字符串,长度与输入字符串相同,初始值为空格
    for (size_t i = 0; i < str.size(); i++) {
        if (str[i] == '(') {
            s.push(i);  // 将左括号的索引入栈
        } else if (str[i] == ')') {
            if (!s.empty()) {
                s.pop();  // 有匹配的左括号,出栈
            } else {
                marks[i] = '?';  // 没有匹配的左括号,标注为?
            }
        }
    }
    while (!s.empty()) {
        marks[s.top()] = '$';  // 剩余在栈中的左括号标注为$
        s.pop();
    }
    cout << str << endl;
    cout << marks << endl;
}

int main() {
    string str;
    while (getline(cin, str)) {  // 循环读取输入的字符串,直到文件结束
        checkBrackets(str);
    }
    return 0;
}

JAVA代码

import java.util.Scanner;
import java.util.Stack;

public class Main {
    // 检查括号匹配情况并输出标注结果的函数
    static void checkBrackets(String str) {
        int len = str.length();
        Stack<Integer> stack = new Stack<>();  // 模拟栈,用于存储左括号的索引
        StringBuilder marks = new StringBuilder();  // 用于记录括号标注情况,初始化为空字符串
        for (int i = 0; i < len; i++) {
            marks.append(" ");  // 先将标注情况初始化为空格,后续根据匹配情况修改
        }
        for (int i = 0; i < len; i++) {
            if (str.charAt(i) == '(') {
                stack.push(i);  // 将左括号的索引入栈
            } else if (str.charAt(i) == ')') {
                if (!stack.isEmpty()) {
                    stack.pop();  // 有匹配的左括号,出栈
                } else {
                    marks.setCharAt(i, '?');  // 没有匹配的左括号,标注为?
                }
            }
        }
        while (!stack.isEmpty()) {
            marks.setCharAt(stack.pop(), '$');  // 剩余在栈中的左括号标注为`$`
        }
        System.out.println(str);
        System.out.println(marks.toString());
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()) {
            String str = scanner.nextLine();  // 循环读取输入的每行字符串
            checkBrackets(str);
        }
    }
}

Python代码

while True:
    try:
        s = input()  # 读取输入的字符串
        stack = []
        marks = [' '] * len(s)  # 初始化标注列表,长度与输入字符串相同,初始值为空格
        for index, char in enumerate(s):
            if char == '(':
                stack.append(index)  # 将左括号的索引添加到栈中
            elif char == ')':
                if stack:
                    stack.pop()  # 有匹配的左括号,出栈
                else:
                    marks[index] = '?'  # 没有匹配的左括号,标注为?
        while stack:
            marks[stack.pop()] = '$'  # 剩余在栈中的左括号标注为$
        print(s)
        print("".join(marks))
    except:
        break

在这里插入图片描述


💐The End💐点点关注,收藏不迷路💐

原文地址:https://blog.csdn.net/qq_41840843/article/details/144270595

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!