扩号匹配问题
💐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)!